gpt4 book ai didi

java - 转换类型 JNI JAVA

转载 作者:行者123 更新时间:2023-11-28 05:56:44 25 4
gpt4 key购买 nike

我正在尝试使用 jni 调用 C++ 中的 native 函数。整个代码都有

const void* 
void **

我在网上进行了研究,java 等价物只是对象类型。但是,在 C++ 中调用这些函数时,我很困惑应该将什么作为参数传入。对象类型真的不能存储任何东西所以我有点困惑。

谢谢!

最佳答案

由于指针长度在不同平台上并不固定,所以这个问题并不像听起来那么微不足道。

三种考虑方式:

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

  • 使用数组(在 Java 中)存储所需的指针。因此,您的 JNI 代码将创建一个长度为 sizeof(void *) 的 jbyteArray,而您的 Java 代码将处理一个 byte[],然后您将指针值复制到该数组中。这是安全和可移植的,只要您的 Java 代码不开始处理数组值(这很愚蠢)。顺便说一句,我建议采用 jbyteArray 的 global ref,因为您通常需要维护该指针值的一些记录,以便以后由 C/C++ 端处理,因此您需要防止 Java来自垃圾收集(通过引用)。

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

关于java - 转换类型 JNI JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com