Pedro
Pedro

Reputation: 4160

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; 
}

Upvotes: 25

Views: 39627

Answers (3)

Seva Alekseyev
Seva Alekseyev

Reputation: 61378

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.

Upvotes: 11

Jonathan Grynspan
Jonathan Grynspan

Reputation: 43472

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.

Upvotes: 22

IronMensan
IronMensan

Reputation: 6831

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

Upvotes: 11

Related Questions