如何在jni中将jbyteArray转换为本机char*?

Sid*_*Sid 13 java java-native-interface

我想在jni中将jbyteArray转换为本机c字符串(char*)?不幸的是我找不到任何关于如何做到这一点的文档.我正在使用c代码中的以下原型调用java函数.

public static byte[] processFile(byte[] p_fileContent)
Run Code Online (Sandbox Code Playgroud)

在c代码中,我正在调用此函数,该函数返回一个字节数组.该字节数组的内容是一个java字符串.但我需要将其转换为ac字符串.

jbyteArray arr = (jbyteArray) env->CallObjectMethod(clsH, midMain, jb);
printf("%s\n", (char*) arr);
Run Code Online (Sandbox Code Playgroud)

DRH*_*DRH 19

我相信你会用GetByteArrayElementsReleaseByteArrayElements.就像是:

boolean isCopy;
jbyte* b = GetByteArrayElements(env, arr, &isCopy);
Run Code Online (Sandbox Code Playgroud)

你应该能够施展bchar*在这一点上,以访问数组中的数据.请注意,这可能会创建数据的副本,因此您需要确保使用ReleaseByteArrayElements以下内容释放内存:

ReleaseByteArrayElements(env, arr, b, 0);
Run Code Online (Sandbox Code Playgroud)

最后一个参数是指示b应如何处理更改的模式.0表示将值复制回arr.如果您不想将数据复制回arr,请JNI_ABORT改用.

有关更多详细信息,请参阅JNI参考.

  • 小心会无效终止。一般来说,文件内容不会以 null 结尾;C(++) 字符串函数可能会因此而卡住。为了可靠地解决这个问题,您必须将文件字节复制到大一个字节的缓冲区中,并将最终字节设置为零 (2认同)