我一直按照@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_t足够大(无论如何,您都隐含地假设它),可以保证从jlong转换为jlong以及向后进行转换。
  • uinttptr_t转换为jlong并向后转换可以避免符号扩展,但是如果uintptr_t太大而无法放入jlong(但所有“理智”的体系结构/编译器仅使用二进制补码算术),则为未定义行为。

  • 10-08 07:04