如何将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;
}
答案 0 :(得分:18)
在一般情况下,jint
相当于int
,因此可以保留约unsigned int
的一半值。转换将以静默方式运行,但如果jint
值为负数或unsigned int
值大于jint
可以容纳的最大值,则结果将不是您所期望的。
答案 1 :(得分:10)
jint
是int32_t
的typedef,因此适用所有常用的投射规则。
答案 2 :(得分:8)
根据您的编译器设置,可能会有或没有关于混合有符号/无符号整数的警告。没有错误。上述答案的所有注意事项 - unsigned int
值为0x80000000(2,147,483,648)及以上将最终为Java端的负整数。
如果必须在Java中保留这些大数字,请使用jlong
作为返回数据类型,并像这样转换:
return (jlong)(unsigned long long)i;
重点是首先扩展到64位,然后抛弃无符号。反之亦然会产生64位负数。