В документе JNI GetStringUTFChars(), который преобразует java-строку jstring
в c++ const char*
, вернет необязательный флаг jboolean
указывающий, выполняет ли он копию или нет в вызове функции. Однако в документе не упоминается, когда GetStringUTFChars() будет или не будет выполнять копирование. Мои вопросы:
Согласно книге "Основной JNI Java Native Interface", реализация JVM определяет, выполнена ли копия или нет. Так что нет, у вас нет контроля над копированием.
Реализация JVM всегда будет связана с тем, следует ли копировать строку или нет, но вы можете уменьшить вероятность создания копии вместо использования GetStringCritical
вместо GetStringUTFChars
. Но обратите внимание, что GetStringCritical
возвращает GetStringCritical
с кодировкой UTF-16 (в отличие от кодированной строки UTF-8, возвращаемой GetStringUTFChars
), поэтому вам может потребоваться преобразование в нужную кодировку.
По моему опыту (Oracle 1.8.0_51-b16 на OS 10.11), GetStringUTFChars
всегда возвращает копию, и GetStringCritical
никогда не возвращает копию, что неудивительно, поскольку Java хранит строки внутри себя как UTF-16, и поэтому извлечение UTF-8 будет, вероятно, требуется сделать копию данных.
GetStringUTFChars
. Возвращаемое значение - более важная часть контракта интерфейса этой функции.