【问题标题】:Passing pointers between C and Java through JNI通过 JNI 在 C 和 Java 之间传递指针
【发布时间】:2011-09-26 11:15:27
【问题描述】:

我一直在遵循 @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 位机器。

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

谢谢, 本

【问题讨论】:

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


    【解决方案1】:

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

    return (jlong)(intptr_t) ptr;
    

    有什么区别?

    • 如果jlong 足够大(无论如何您都隐含地假设它是),则可以保证从intptr_t 转换到jlong 并返回。
    • uinttptr_t 转换为jlong 并返回可避免符号扩展,但如果uintptr_t 太大而无法放入jlong(但所有“正常”架构/编译器只使用二进制补码算法)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多