问题
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