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, поэтому применяются все обычные правила кастинга.