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

我一直在通过JNI在Java中存储c指针,遵循@tulskiy的建议在这篇文章中通过JNI传递C和Java之间的指针

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

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

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

我希望我的代码编译时没有警告,这样如果有合法的警告,我会看到它。 有人有主意吗?

谢谢,本

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

 return (jlong)(intptr_t) ptr; 

区别?

  • 如果jlong足够大,那么从intptr_tjlong和back可以保证工作(无论如何你都隐含地假设它)。
  • uinttptr_tjlong并返回可避免符号扩展,但如果uintptr_t太大而无法放入jlong (但所有“理智”架构/编译器只使用二进制补码算法),则行为未定义

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