JNI: GetStringUTFChars () генерирует OOM при сбое или нет? - PullRequest
1 голос
/ 12 декабря 2011

В настоящее время я работаю над моим проектом, который будет интенсивно использовать JNI, и JNI является для меня совершенно новым ... Я много читаю об этом, и у меня есть одна проблема: в одной нативной функции я хочувернуть целое число, которое является состоянием операции, и в случае, когда я не могу выделить строки с помощью GetStringUTFChars (), я хочу вернуть определенный код ошибки.

Но у меня есть две документации, которые, кажется, не согласны:

Я склонен верить второй документации, поскольку она более новая.Я ошибаюсь?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

Я думаю, что два комплекта документации совпадают (по крайней мере, версии, на которые я сейчас смотрю).

С http://java.sun.com/docs/books/jni/html/objtypes.html:

Не забудьте проверить возвращаемое значение GetStringUTFChars. Поскольку для реализации виртуальной машины Java необходимо выделить память для хранения строки UTF-8, существует вероятность того, что выделение памяти завершится неудачно. Когда это происходит, GetStringUTFChars возвращает NULL и выдает исключение OutOfMemoryError. Как мы узнаем в главе 6, создание исключения через JNI отличается от создания исключения в языке программирования Java. Ожидающее исключение, выданное через JNI, не меняет автоматически поток управления в собственном коде C. Вместо этого нам нужно выполнить явный оператор возврата, чтобы пропустить оставшиеся операторы в функции C. После возврата Java_Prompt_getLine исключение будет выдано в Prompt.main, вызывающем собственный метод Prompt.getLine.

С http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html:

ВОЗВРАТ:

Возвращает указатель на измененную строку UTF-8 или NULL, если операция завершается неудачей.

Таким образом, оба утверждают, что NULL возвращается при сбое, но первый идет дальше и утверждает, что, как только функция JNI C ++ вернется, на уровне Java будет сгенерировано исключение.

0 голосов
/ 13 декабря 2011

ОК, хорошо, после игры с ulimits и тому подобным, чтобы вызвать собственный сбой, я получил сбой JVM из-за невозможности malloc () для GetStringUTFChars (): /

Полагаю, я просто предположу, что он возвращает NULL в случае сбоя, и покончу с этим, хотя я очень сомневаюсь, что это когда-нибудь случится - JVM наверняка потерпит крах раньше, хе.

...