java - 通过 JNI 在 C 和 Java 之间传递指针

标签 java c pointers casting java-native-interface

按照@tulskiy 在这篇文章 Passing pointers between C and Java through JNI 中的建议,我一直在通过 JNI 在 Java 中存储 c 指针。

诀窍是将指针转换为 jlong​​。所以从 c 我有 return (jlong​​) ptr;

我要返回一个 jlong​​(总是 64 位),因为我希望我的代码在 64 位和 32 位系统上都能工作。 64位计算机上64位指针在内存中的大小为64位,而在32位计算机上,指针在内存中的大小为32位。

问题是在 32 位机器上我收到编译器警告“从不同大小的指针转换为整数”。如果我有,警告就会消失 return (jlong​​) (int32_t) ptr; 但是这段代码不适合 64 位机器。

我想让我的代码在没有警告的情况下编译,这样如果有合法的警告我就会看到它。有人有什么想法吗?

谢谢, 本

最佳答案

C 中有各种方便的整数类型。您想要的可能是 intptr_t 或 uintptr_t:

return (jlong)(intptr_t) ptr;

区别是什么?

  • intptr_tjlong​​ 的转换保证可以正常工作,前提是 jlong​​ 足够大(你隐含地假设它是无论如何).
  • uinttptr_t 转换为 jlong​​ 并返回可以避免符号扩展,但如果 uintptr_t 太大而无法容纳,则为未定义行为一个 jlong​​ (但所有“理智的”架构/编译器只使用二进制补码算法)

关于java - 通过 JNI 在 C 和 Java 之间传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6543396/

相关文章:

c - C 中使用分隔符分割字符串

c++-cli - 在 C++/CLI 中传递非托管指针

java - 来自 Hibernate 的同步类加载器调用

java - 我怎么知道何时何地调用父类(super class)的重写方法

c - 此代码第一次迭代后出现意外输出

c - 在函数中填充结构字段时出现 malloc 段错误

c - C中带符号数的数组索引

java - 如何更改 JComboBox 的选定值

java - 目录 java Flying Saucer ?

c - 分隔字符串中的字符并将其值分配给变量