Java 字节流/C/JNI
在C API实现中,通常使用哪些数据类型来存储字节流? 如何将此类型转换为jbyteArray?即(const)unsigned char*表示一个内存块,其中包含字节本身,再加上一个告诉您字节数的大小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实例化一个数组,或者通过将引用作为
似乎讨论了如何创建合适的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()并直接返回它