C API实现中通常使用哪些数据类型来存储字节流? 如何将此类型转换为jbyteArray?
答案 0 :(得分:1)
那是(const)unsigned char *,表示一个自己保存字节的内存块,再加上一个size_t,告诉你字节数。
This thread似乎讨论了如何创建合适的Java类型(NewByteArray()是函数)。
答案 1 :(得分:1)
请参阅Java_ReadFile_loadFile示例,它们使用NewByteArray()并直接返回。
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html
答案 2 :(得分:0)
你的问题不是很清楚。
假设C中有一些字节代表字符,最好的办法是将字节转换为Java并使用Java的字节转换将它们转换为文本。
在JNI中,您只需要通过使用JNI实例化一个Java数组,或者通过将引用作为参数传递(您仍然需要在JNI代码中“实现”指针)来实现Java数组。 / p>
我之前做过这件事,所以这里是代码FYI。此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;
}
答案 3 :(得分:0)
您无需转换它们。类型jbyteArray和char *是兼容的。
Java声明:
private static native int doSomething(bate[] string, int length);
C delaration:
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]
}
}
您可以以相同的方式将值传递回java。但是在调用C函数之前,请确保初始化字节数组的长度。