通过JNI传递C和Java之间的指针

时间:2011-07-01 03:48:19

标签: java c pointers casting java-native-interface

我已经在这篇文章{@ 3}}中按照@tulskiy的建议,通过JNI存储了Java指针。{/ 3>

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

我正在返回一个jlong​​(总是64位),因为我希望我的代码可以在64位和32位系统上运行。 64位计算机上64位指针的内存大小为64,因此在32位计算机上,内存中指针的大小为32位。

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

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

谢谢, 本

2 个答案:

答案 0 :(得分:13)

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

return (jlong)(intptr_t) ptr;

区别?

  • intptr_t投射到jlong并返回保证可以正常工作,前提是jlong足够大(无论如何你都隐含地假设它)。
  • uinttptr_t投射到jlong并向后投射可以避免使用符号扩展,但如果uintptr_t太大而无法放入jlong(但所有{{1}},则会出现未定义的行为“理智的”架构/编译器只使用二进制补码算法

答案 1 :(得分:1)

尝试使用intptr_t进行强制转换(无论平台容量如何,都存储指针)。