21

如何将 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; 
}
4

3 回答 3

19

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

于 2011-11-04T16:28:10.667 回答
10

jint是一个 typedef ,int32_t所以所有通常的转换规则都适用。

于 2011-11-04T16:26:14.723 回答
9

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

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

return (jlong)(unsigned long long)i;

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

于 2011-11-04T16:39:52.857 回答