转换类型JNI JAVA

时间:2015-11-30 22:49:06

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

我试图用jni在c ++中调用本机函数。整个代码都有

ftell()

我在网上研究过,java等价物只是对象类型。但是,当我在c ++中调用这些函数时,我混淆了作为参数传入的内容。对象类型实际上无法存储任何内容,所以我有点困惑。

谢谢!

1 个答案:

答案 0 :(得分:1)

由于指针长度在不同平台上并不固定,因此这个问题并不像听起来那么简单。

有三种方法可以考虑:

  • 使用64位的Java long(JNI中的jlong​​)。这假设没有人需要超过64位的指针,这是一个我很乐意避免的争议。 :-)不是严格的便携式,但可能安全(暂时)。

  • 使用数组(在Java中)存储所需的指针。因此,您的JNI代码将创建长度为sizeof(void *)的jbyteArray,并且您的Java代码将处理byte [],并且您将指针值复制到该数组中。只要您的Java代码没有开始使用数组值(这将是愚蠢的),这是安全和可移植的。顺便说一下,我建议使用jbyteArray的全局引用,因为你通常需要维护一些指针值的记录,以便以后由C / C ++方面处理,所以你需要防止Java从垃圾收集它(通过参考)。

  • 最后,让您的C / C ++代码管理映射的哈希表(或类似)映射句柄。手柄可以是例如Java int类型(C / C ++和Java端都是32位),指针的长度是JNI代码的问题。优点是抽象和可移植性。缺点是复杂性(除非您使用C / C ++哈希表代码)。该映射数据的持久性也是一个问题。