Java 如何在jni中将jbyteArray转换为本机字符*?

Java 如何在jni中将jbyteArray转换为本机字符*?,java,java-native-interface,Java,Java Native Interface,我正在尝试在jni中将jbyteArray转换为本机c字符串(char*)?不幸的是,我找不到任何关于如何做到这一点的文档。我正在用c代码中的以下原型调用java函数 public static byte[] processFile(byte[] p_fileContent) 在c代码中,我调用了这个返回字节数组的函数。这个字节数组的内容是一个java字符串。但是我需要把它转换成c字符串 jbyteArray arr = (jbyteArray) env->CallObjectMetho

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

public static byte[] processFile(byte[] p_fileContent)
在c代码中,我调用了这个返回字节数组的函数。这个字节数组的内容是一个java字符串。但是我需要把它转换成c字符串

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

我相信您会使用
getbytearrayelents
releasebytarrayelents
。比如:

boolean isCopy;
jbyte* b = GetByteArrayElements(env, arr, &isCopy);

此时,您应该能够将
b
转换为
char*
,以便访问数组中的数据。请注意,这可能会创建数据的副本,因此您需要确保使用
ReleaseByteArrayElements
释放内存:

ReleaseByteArrayElements(env, arr, b, 0);
最后一个参数是一个模式,指示应如何处理对
b
的更改
0
表示值被复制回
arr
。如果不想将数据复制回
arr
,请改用
JNI\u ABORT


有关更多详细信息,请参阅。

@DRH将1.4.2链接更新为1.5链接并不是一个很大的改进。小心会导致无效终止。通常,文件内容不会以null结尾;C(++)字符串函数可能会因此而阻塞。为了可靠地解决这个问题,您必须将文件字节复制到一个大一个字节的缓冲区中,并将最后一个字节设置为零
ReleaseByteArrayElements()
必须被调用,即使不涉及复制操作