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

Ben*_*Ben 10 c java java-native-interface pointers casting

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

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

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

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

我希望我的代码在没有警告的情况下进行编译,这样如果有合法警告,我会看到它.有人有主意吗?

谢谢,本

tc.*_*tc. 13

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

return (jlong)(intptr_t) ptr;
Run Code Online (Sandbox Code Playgroud)

区别?

  • 从铸造intptr_tjlong和背部是保证工作提供jlong足够大(这你隐含假设它是无论如何).
  • uinttptr_tto jlong和back转换避免了符号扩展,但是如果uintptr_t它太大jlong而不适合(但是所有"理智的"架构/编译器只使用二进制补码算法)是未定义的行为