C API 实现中通常使用哪些数据类型来存储字节流?如何将此类型转换为 jbyteArray?
4 回答
请参阅他们使用 NewByteArray() 并直接返回它的 Java_ReadFile_loadFile 示例。
http://dev.cs.ovgu.de/java/Books/JDCBook/jnistring.html
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
struct stat finfo;
jboolean iscopy;
const jchar *mfile = (*env)->GetStringChars(env,
name, &iscopy);
//...
(*env)->ReleaseStringChars(env, name, mfile);
那将是 (const) unsigned char * 代表一个保存字节本身的内存块,再加上一个 size_t 告诉你字节数。
该线程似乎讨论了如何创建合适的 Java 类型(NewByteArray() 是函数)。
你的问题不是很清楚。
假设您在 C 中有一些字节表示字符,最好的办法是将这些字节转换为 Java,然后使用 Java 的字节转换将它们转换为文本。
在 JNI 中,您只需要通过使用 JNI 来实例化一个 Java 数组,或者通过将引用作为参数传入(您仍然需要在 JNI 代码中“实现”一个指针)来实现一个 Java 数组。
我以前做过后一件事,所以这里是代码仅供参考。这个 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;
}
你不需要转换它们。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]
}
}
您可以以相同的方式将值传递回 java。但请确保在调用 C 函数之前初始化字节数组的长度。