Следует ли вызывать ReleaseStringUTFChars, если GetStringUTFChars вернул копию?

#java #java-native-interface

#java #java-native-interface

Вопрос:

Книга «Essential JNI: Java Native Interface» Роба Гордона содержит следующий пример кода для преобразования jstring в строку C:

 const char* utf_string;
jboolean isCopy;
utf_string = env->GetStringUTFChars(str, amp;isCopy);
/* ... use string ... */
if (isCopy == JNI_TRUE) {
    env->ReleaseStringUTFChars(str, utf_string);
}
  

Обратите внимание, что он вызывается только, ReleaseStringUTFChars если isCopy имеет значение true.

Но в книге Собственный интерфейс Java: руководство программиста и спецификация (альтернативная ссылка: http://192.9.162.55/docs/books/jni/html/objtypes.html#5161 ) говорится:

Вызов ReleaseString-Chars необходим независимо от того, присвоил ли GetStringChars *isCopy значение JNI_TRUE или JNI_FALSE. ReleaseStringChars либо освобождает копию, либо открепляет экземпляр, в зависимости от того, вернул GetStringChars копию или нет.

Я прав, предполагая, что это ошибка в книге Гордона?

Комментарии:

1. где str определяется?

Ответ №1:

Да, ваше предположение верно (вы всегда должны вызывать ReleaseStringUTFChars).

Комментарии:

1. Что произойдет, если он не будет вызван?

2. Произойдет утечка памяти (JVM будет считать, что память вам нужна на неопределенный срок).

3. Конечно! Но почему у нас нет функции свободного выделения памяти для других типов данных, таких как: int, double . Это должно быть RealseInt (аргумент, arg), ReleaseDouble (аргумент, arg) … или что-то в этом роде?

4. Int и double не являются строками переменной длины, как строки, поэтому данные могут быть тривиально скопированы вызывающему. (Вероятно, лучше создать новый вопрос, а не продолжать обсуждение ответа 6-летней давности.)

5. Пожалуйста, поясните. Я читал, что произвольные аргументы передаются как метод механизма передачи из Java в C в качестве локальной ссылки. Если да, то в конечном итоге он будет очищен, как только будет выполнено выполнение собственного метода, и утечки памяти не будет, верно?