JNI: converting unsigned int to jint

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-10 12:29:22

问题


How do I convert an unsigned int to jint? Do I have to convert it at all, or can I just return it without any special treatment? This is basically my code right now, but I can't test it, as I haven't setup JNI locally.

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

回答1:


In the general case, jint is equivalent to int, and so can hold about half the values of unsigned int. Conversion will work silently, but if a jint value is negative or if an unsigned int value is larger than the maximum value a jint can hold, the result will not be what you are expecting.




回答2:


jint is a typedef for int32_t so all the usual casting rules apply.




回答3:


Depending on your compiler settings, there may or may not be a warning about mixing signed/unsigned integers. There will be no error. All the caveats from the answers above apply - unsigned int values of 0x80000000 (2,147,483,648) and above will end up as negative integers on the Java side.

If it's imperative that those large numbers are preserved in Java, use a jlong as a return datatype instead, and convert like this:

return (jlong)(unsigned long long)i;

The point is to first expand to 64 bits, then to cast away unsigned-ness. Doing it the other way around would produce a 64-bit negative number.



来源:https://stackoverflow.com/questions/8012450/jni-converting-unsigned-int-to-jint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!