#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 в качестве локальной ссылки. Если да, то в конечном итоге он будет очищен, как только будет выполнено выполнение собственного метода, и утечки памяти не будет, верно?