JNI:将unsigned int转换为jint

Ped*_*dro 19 c++ java java-native-interface unsigned-integer

如何将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; 
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*pan 18

在一般情况下,jint相当于int,所以可以保持约一半的值unsigned int.转换将以静默方式工作,但如果jint值为负或者某个unsigned int值大于a jint可以容纳的最大值,则结果将不是您所期望的.


Iro*_*san 10

jint是一个typedef,int32_t因此所有通常的施法规则都适用.


Sev*_*yev 8

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

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

return (jlong)(unsigned long long)i;
Run Code Online (Sandbox Code Playgroud)

重点是首先扩展到64位,然后抛弃无符号.反之亦然会产生64位负数.