JNI: преобразование unsigned int в jint
Как преобразовать 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;
}
Ответы
Ответ 1
В общем случае jint
эквивалентно int
, и поэтому может содержать около половины значений unsigned int
. Конверсия будет работать тихо, но если значение jint
отрицательное или если значение unsigned int
больше максимального значения a jint
, результат не будет таким, каким вы ожидаете.
Ответ 2
В зависимости от ваших параметров компилятора может быть или не быть предупреждение о смешении целых чисел с подписью/без знака. Ошибок не будет. Все предостережения из приведенных выше ответов применимы - значения unsigned int
0x80000000 (2 147 483 648) и выше будут заканчиваться как отрицательные целые числа на стороне Java.
Если необходимо, чтобы эти большие числа были сохранены в Java, вместо этого используйте jlong
в качестве возвращаемого типа данных и конвертируйте вот так:
return (jlong)(unsigned long long)i;
Точка состоит в том, чтобы сначала развернуть до 64 бит, а затем отбросить беззнаковое. Выполнение этого наоборот создало бы 64-битное отрицательное число.
Ответ 3
jint
является typedef для int32_t
, поэтому применяются все обычные правила кастинга.