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-битное отрицательное число.