Хранение аргумента const char*
для NewStringUTF()
полностью является вашей ответственностью: если вы выделили test
с malloc()
, то вам нужно free()
. Итак, размещенный вами фрагмент верен. Вы портите кучу где-то еще.
Я вижу противоречивые мнения. Некоторые говорят, что я
должен освободить его сам, некоторые говорят, что ВМ
освобождает это, некоторые говорят, что VM не освобождает
это и вы должны сделать странное вуду
магия, чтобы освободить его. Я в замешательстве.
Они говорят об экземпляре jstring
, возвращаемом NewStringUTF()
. Это следует за запутанными правилами для «локальных ссылок» .
Никогда не ошибочно выпускать эту ссылку с DeleteLocalRef()
, когда вы закончите с ней. Однако JVM выполняет некоторую сомнительную магию, если вы вызываете NewStringUTF()
в контексте потока JVM. Когда нативный метод возвращается в Java, любые утечки локальных ссылок автоматически очищаются. Поэтому, если вы уверены, что ваш конечный вызывающий абонент находится в потоке Java, вы можете спокойно утратить ссылку.
С другой стороны, если вы работаете в контексте собственного потока, скажем, какого-то потока сообщений о событиях, делающего обратные вызовы в Java, возврата в Java никогда не будет, поэтому вы должны сами вызвать DeleteLocalRef()
на этом jstring
(и в действительности все остальные локальные ссылки, возвращаемые типичными вызовами JNI).