JNI: преобразование неподписанного int в jint

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

Решение

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

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

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

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

return (jlong)(unsigned long long)i;

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

Другие вопросы по тегам