Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字节流/C/JNI_Java_C_Java Native Interface - Fatal编程技术网

Java 字节流/C/JNI

Java 字节流/C/JNI,java,c,java-native-interface,Java,C,Java Native Interface,在C API实现中,通常使用哪些数据类型来存储字节流? 如何将此类型转换为jbyteArray?即(const)unsigned char*表示一个内存块,其中包含字节本身,再加上一个告诉您字节数的大小 似乎讨论了如何创建合适的Java类型(函数是NewByteArray()。您的问题不是很清楚 假设您在C中有一些表示字符的字节,最好的办法是将这些字节转换成Java,并使用Java的字节转换将它们转换成文本 在JNI中,您只需要具体化Java数组,或者使用JNI实例化一个数组,或者通过将引用作为

在C API实现中,通常使用哪些数据类型来存储字节流? 如何将此类型转换为jbyteArray?

即(const)unsigned char*表示一个内存块,其中包含字节本身,再加上一个告诉您字节数的大小


似乎讨论了如何创建合适的Java类型(函数是NewByteArray()。

您的问题不是很清楚

假设您在C中有一些表示字符的字节,最好的办法是将这些字节转换成Java,并使用Java的字节转换将它们转换成文本

在JNI中,您只需要具体化Java数组,或者使用JNI实例化一个数组,或者通过将引用作为参数传入(对于该参数,您仍然需要在JNI代码中“具体化”指针)

我以前做过后一件事,所以这里是代码供参考。这个JNI调用使用AS/400 C API读取数据库记录并将字节返回给Java—Java代码随后使用记录格式信息将字段提取为字符串。希望这能有所帮助:

JNIEXPORT jboolean JNICALL Java_com_xxx_DB2File_jniRead(JNIEnv *jep, jobject thsObj,                    
 jlong handle, jint readOp, jbyteArray jvaDta, jint jvaDtaMax, jint flags) {                                                
    OBJDTA           *odp;                                                                                                  
    jbyte            *jniDta;                                                                                               
    _RIOFB_T         *fbp;                                                                                                  

    thsObj=thsObj;                                                                                                          
    if((odp=getDataspace(handle))==NULL) {                                                                                  
        throwEscape(jep,90003,"Invalid handle for dataspace in jniRead()");                                                 
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    jniDta=(*jep)->GetByteArrayElements(jep,jvaDta,0);                                                                      

    // read database record here

    if(fbp->num_bytes<=0) {                                                                                                 
        (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */         
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    if(fbp->num_bytes!=odp->rcdLen) {                                                                                       
        byte             errtxt[201];                                                                                       

        asd_errtxt(errno,errtxt,sizeof(errtxt));                                                                            
        (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */         
        throwEscape(jep,90204,"Native function jniRead failed.  Got %i, expected %i (%s)",fbp->num_bytes,odp->rcdLen,       
         errtxt);                                                                                                           
        return JNI_FALSE;                                                                                                   
        }                                                                                                                   
    (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,0); /* copy changed array back to java */                            
    return JNI_TRUE;                                                                                                        
    }                                                                                                                       
JNIEXPORT jboolean JNICALL Java_com_xxx_DB2File_jnired(JNIEnv*jep,jobject thsObj,
jlong handle、jint readOp、jbyteArray jvaDta、jint jvaDtaMax、jint flags){
OBJDTA*odp;
jbyte*jniDta;
_RIOFB_T*fbp;
thsObj=thsObj;
如果((odp=getDataspace(handle))==NULL){
throwEscape(jep,90003,“jniRead()中数据空间的无效句柄”);
返回JNI_FALSE;
}                                                                                                                   
jniDta=(*jep)->getbytearrayellements(jep,jvaDta,0);
//在此处读取数据库记录
如果(fbp->num_bytesReleaseByteArrayElements(jep、jvaDta、jniDta、JNI_ABORT);/*不要将更改的数组复制回java*/
返回JNI_FALSE;
}                                                                                                                   
如果(fbp->num_bytes!=odp->rcdLen){
字节errtxt[201];
asd_errtxt(errno,errtxt,sizeof(errtxt));
(*jep)->ReleaseByteArrayElements(jep、jvaDta、jniDta、JNI_ABORT);/*不要将更改后的数组复制回java*/
throwEscape(jep,90204,“本机函数jniRead失败。获取%i,预期为%i(%s)”,fbp->num_bytes,odp->rcdLen,
errtxt);
返回JNI_FALSE;
}                                                                                                                   
(*jep)->ReleaseByteArrayElements(jep、jvaDta、jniDta、0);/*将更改后的数组复制回java*/
返回JNI_TRUE;
}                                                                                                                       

您不需要转换它们。jbyteArray和char*类型是兼容的

Java声明:

private static native int doSomething(bate[] string, int length);
C.三角洲:

JNIEXPORT jint JNICALL Java_package_class_doSomething(JNIEnv *env, jclass jc, jbyteArray string, jint length) {
    int i;
    for (i = 0; i < length; i++) {
        // read string[i]
    }
}
JNIEXPORT jint JNICALL Java_package_class_doSomething(JNIEnv*env,jclass jc,jbyteArray string,jint长度){
int i;
对于(i=0;i

您可以用同样的方法将值传回java。但在调用C函数之前,请确保字节数组的长度已初始化。

请参阅java_ReadFile_loadFile示例,其中使用了NewByteArray()并直接返回它