【问题标题】:How to return an array in JNI?如何在 JNI 中返回一个数组?
【发布时间】:2011-10-06 16:48:11
【问题描述】:

我有一个通过 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 方法。有人知道怎么做吗?

更新:

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

fyi - “Java 原生接口 - 程序员指南和规范”给出了使用其功能的错误示例。

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

不编译。相反,正确的语法是:

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

【问题讨论】:

  • 示例对C代码是正确的,其中JNIEnv的typedef是JNI函数指针的结构。对于 C++ 方法调用,只需省略记录的 JNI 函数的第一个参数。

标签: java visual-c++ java-native-interface


【解决方案1】:

请参阅JNI documentation on array operationsGetCharArrayRegion 的对应物是 SetCharArrayRegion

jchar 是一个短字符,而不是一个字符。 Java 支持 Unicode 字符。如果你想要一个字节数组,你可以使用 jbytearray。

另一种方法是使用JNI string operations

【讨论】:

  • 所有这些数组都是 64 字节(无符号 8 位),因此在 vc++ 中它们需要是“无符号字符”。 jchar 是我在 JNI 中能找到的最接近的映射 - 即使它是无符号的 16 位,我也可以成功地将其类型转换为“无符号字符”,因为我确保 java 端永远不会超出界限。我不能使用 jbyte 类型,因为它是 8 位签名的并且没有我需要的范围。
  • 你提到了强制转换数组——那是行不通的。铸造单个角色会起作用;您还可以使用字节并在 Java 端进行转换。 [编辑答案与您在上一段中提到的具体方法的对应部分。]
  • 是的,我知道,我的意思是运行一个“for”循环,每个元素都进行了适当的类型转换。无论如何,使用“getarrayregion”时是否必须调用“释放数组”函数 - 还是仅用于“getarrayelements”?
  • 不,release 方法适用于名称相似的 get 方法,可能会返回指向数组的直接指针。抱歉最初的误导;在第一次阅读时,我错过了您已经使用的特定方法。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多