JNI中如何返回一个数组?

4

我使用JNI访问本地函数,需要将一个数组的内容返回给Java。我的函数原型如下:

JNIEXPORT jcharArray JNICALL Java_jniusb_Main_receiveData
  (JNIEnv *, jclass, jchar);

这段代码是使用javah.exe生成的。

在函数的代码中,我有一个数组'unsigned char InputPacketBuffer [65]',我想将其返回给Java。然而,我在将其映射到我的返回类型'jcharArray'时遇到了问题。

在另一个函数中,我使用JNI提供的“GetCharArrayRegion”方法将类型为“jcharArray”的输入参数转换为“jchar”数组,然后可以将其强制转换为“unsigned char”数组。基本上,我需要做相反的操作以在另一个方向上进行转换,但我没有在JNI规范PDF中找到合适的JNI方法。有人知道如何做吗?

更新:

我在安迪的链接上找到了正确的JNI函数-SetCharArrayRegion()。

值得注意的是,“Java本地接口-程序员指南和规范”在使用它们的函数的示例中给出了不正确的示例。

即:

(*env)->SetCharArrayRegion(env, elemArr, 0, len, chars); 

无法编译。正确的语法应该是:

(*env).SetCharArrayRegion(elemArr, 0, len, chars);

这些示例适用于 C 代码,其中 JNIEnv 的 typedef 是 JNI 函数指针的结构体。对于 C++ 方法调用,只需省略文档化的 JNI 函数的第一个参数即可。 - Andy Thomas
1个回答

4
请查看JNI文档中的数组操作。与GetCharArrayRegion相对应的是SetCharArrayRegion
jchar是short类型而不是char类型。Java支持Unicode字符。如果您需要字节数组,则可以使用jbytearray。
另一种选择是使用JNI字符串操作

所有这些数组都是64字节(无符号8位),因此它们需要在vc++中为“unsigned char”。在JNI中,jchar是我能找到的最接近的映射对象,即使它是无符号16位,我也可以成功地将其强制转换为“unsigned char”,因为我确保Java端永远不会超出范围。我不能使用jbyte类型,因为它是有符号8位,没有我需要的范围。 - Ben
你提到了对数组进行强制转换 - 这是行不通的。强制转换单个字符是可行的;你也可以使用字节并在Java端进行转换。[通过编辑回答,提供了与你在最后一段提到的特定方法相对应的方法。] - Andy Thomas
是的,我知道,我的意思是使用适当的类型转换运行“for”循环。 无论如何,当使用“getarrayregion”时,您是否必须调用“release array”函数或者它仅适用于“getarrayelements”? - Ben
不,release方法是针对可能返回数组的直接指针的同名get方法设计的。抱歉之前给你带来一些误导;在第一次阅读时我错过了你已经使用的具体方法。 - Andy Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接