Каково время жизни объекта jstring в JNI? - PullRequest
3 голосов
/ 17 августа 2011

У меня мало знаний о JNI и о том, как все происходит в среде JNI.У меня простой вопрос.

У меня есть метод в Java, который вызывает метод JNI и передает параметр String в.Метод JNI принимает эту строку в объекте jstring и сохраняет ее в static vector<jstring>.

Мой вопрос: безопасно ли использовать этот вектор на протяжении всего жизненного цикла Java-приложения?Нужно ли учитывать тот факт, что GC может перемещаться String в Java среде?Это вызовет какие-либо проблемы в этой ситуации?если да, то какой должен быть правильный путь?

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Это может или не может быть хорошо, в основном виртуальная машина дает вам очень мало обещаний о том, что происходит с памятью, используемой jstrings после вызова JNI

В значительной степени прямо из источника: http://java.sun.com/docs/books/jni/html/objtypes.html

JNI передает объекты нативным методам в виде непрозрачных ссылок.Непрозрачные ссылки - это типы указателей C, которые ссылаются на внутренние структуры данных в виртуальной машине Java.Точное расположение внутренних структур данных, однако, скрыто от программиста.Собственный код должен манипулировать базовыми объектами через соответствующие функции JNI, которые доступны через указатель интерфейса JNIEnv.Например, соответствующий тип JNI для java.lang.String - это jstring.Точное значение ссылки jstring не имеет отношения к нативному коду.Нативный код вызывает функции JNI, такие как GetStringUTFChars (§3.2.1), для доступа к содержимому строки.

Короче говоря, вы все равно не должны напрямую обращаться к значению jstring, поэтому нетпричина хранить jstrings, использовать соответствующие методы для преобразования их в собственные строки и хранить их таким образом.

0 голосов
/ 17 августа 2011

Безопасно ли использовать этот вектор на протяжении всего жизненного цикла Java-приложения?

Нет.См. Спецификацию JNI Ch.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...