JNI: преобразование беззнакового целого числа в 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; 
}

person Pedro    schedule 04.11.2011    source источник


Ответы (3)


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

person Jonathan Grynspan    schedule 04.11.2011
comment
Я храню только небольшие числа, которые никогда не превысят пределы jint, так что все должно быть в порядке. - person Pedro; 04.11.2011
comment
@Jonathan Как только значение достигает половины емкости беззнакового целого числа, оно дает отрицательное целое число из-за того, как реализованы типы; маленькие значения в порядке - person Will03uk; 05.11.2011
comment
Да, я знаю, как работает int. Я спрашиваю Педро, есть ли в его данных отрицательные числа. - person Jonathan Grynspan; 05.11.2011

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

person IronMensan    schedule 04.11.2011

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

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

return (jlong)(unsigned long long)i;

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

person Seva Alekseyev    schedule 04.11.2011