Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JNI: converting unsigned int to jint

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; 
}
like image 795
Pedro Avatar asked Nov 04 '11 16:11

Pedro


3 Answers

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.

like image 176
Jonathan Grynspan Avatar answered Nov 18 '22 11:11

Jonathan Grynspan


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

like image 44
IronMensan Avatar answered Nov 18 '22 11:11

IronMensan


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.

like image 11
Seva Alekseyev Avatar answered Nov 18 '22 10:11

Seva Alekseyev