【问题标题】:JNI: converting unsigned int to jintJNI:将 unsigned int 转换为 jint
【发布时间】:2011-11-04 16:20:24
【问题描述】:

如何将 unsigned int 转换为 jint?我是否必须转换它,或者我可以在没有任何特殊处理的情况下将其退回?这基本上是我现在的代码,但我无法测试它,因为我没有在本地设置 JNI。

JNIEXPORT jint JNICALL
Java_test_test(JNIEnv* env, jobject obj, jlong ptr)
{
    MyObject* m = (MyObject*) ptr; 
    unsigned int i = m->get(); 
    return i; 
}

【问题讨论】:

    标签: java c++ java-native-interface unsigned-integer


    【解决方案1】:

    根据您的编译器设置,可能会有也可能没有关于混合有符号/无符号整数的警告。不会有错误。上述答案中的所有警告都适用 - unsigned int 0x80000000 (2,147,483,648) 及以上的值最终将在 Java 端作为负整数。

    如果必须在 Java 中保留这些大数字,请改用 jlong 作为返回数据类型,并像这样进行转换:

    return (jlong)(unsigned long long)i;
    

    关键是首先扩展为 64 位,然后丢弃无符号。反过来做会产生一个 64 位的负数。

    【讨论】:

      【解决方案2】:

      在一般情况下,jint 等价于 int,因此可以保存 unsigned int 大约一半的值。转换将静默进行,但如果 jint 值为负数或 unsigned int 值大于 jint 可以保持的最大值,则结果将不是您所期望的。

      【讨论】:

      • 我只存储小数字,永远不会超过 jint 的限制,所以应该没问题。
      • @Jonathan 一旦值达到 unsigned int 容量的一半,由于类型的实现方式,它将给出负 int;小值很好
      • 是的,我知道int 的工作原理。我在问 Pedro 他的数据是否包含负数。
      【解决方案3】:

      jintint32_t 的 typedef,因此所有常见的转换规则都适用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-18
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多