Java JNI:将无符号int转换为jint

Java JNI:将无符号int转换为jint,java,c++,java-native-interface,unsigned-integer,Java,C++,Java Native Interface,Unsigned Integer,如何将无符号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; } jint是

如何将无符号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; 
}

jint
int32\u t
的类型定义,因此所有常用的强制转换规则都适用。

在一般情况下,
jint
相当于
int
,因此可以容纳约一半的
无符号int
值。转换将以静默方式进行,但如果
jint
值为负值,或者
无符号int
值大于
jint
可以容纳的最大值,则结果将不是您期望的结果。

根据您的编译器设置,可能会或可能不会出现关于混合有符号/无符号整数的警告。不会有错误。以上答案中的所有注意事项均适用-
unsigned int
0x8000000(2147483648)及以上的值将在Java端以负整数结束

如果必须在Java中保留这些大数字,请使用
jlong
作为返回数据类型,并按如下方式转换:

return (jlong)(unsigned long long)i;

关键是要先扩展到64位,然后去掉无符号。反过来做会产生一个64位的负数。

我只存储很少的数字,这永远不会超过jint的限制,所以应该可以。@Jonathan一旦该值达到无符号int的一半容量,它将根据类型的实现给出一个负int;小值很好是的,我知道
int
是如何工作的。我在问佩德罗他的数据是否包含负数。