JNI: преобразование неподписанного int в jint - PullRequest
18 голосов
/ 04 ноября 2011

Как мне преобразовать неподписанное целое в 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; 
}

Ответы [ 3 ]

18 голосов
/ 04 ноября 2011

В общем случае jint эквивалентно int, и поэтому может содержать около половины значений unsigned int.Преобразование будет работать тихо, но если значение jint является отрицательным или значение unsigned int больше максимального значения, которое может содержать jint, результат не будет тем, что вы ожидаете.

10 голосов
/ 04 ноября 2011

jint - это typedef для int32_t, поэтому применяются все обычные правила приведения.

8 голосов
/ 04 ноября 2011

В зависимости от настроек вашего компилятора, может быть или не быть предупреждение о смешивании целых чисел со знаком и без знака. Там не будет ошибки. Применяются все предостережения из приведенных выше ответов - unsigned int значения 0x80000000 (2 147 483 648) и выше приведут к отрицательным целым числам на стороне Java.

Если необходимо, чтобы эти большие числа были сохранены в Java, вместо этого используйте jlong в качестве возвращаемого типа данных и выполните преобразование следующим образом:

return (jlong)(unsigned long long)i;

Смысл в том, чтобы сначала расширить до 64 бит, а затем отбросить беззнаковое. Если сделать это наоборот, получится 64-битное отрицательное число.

...