GetStringUTFChars и его поведение копирования строк

0

В документе JNI GetStringUTFChars(), который преобразует java-строку jstring в c++ const char*, вернет необязательный флаг jboolean указывающий, выполняет ли он копию или нет в вызове функции. Однако в документе не упоминается, когда GetStringUTFChars() будет или не будет выполнять копирование. Мои вопросы:

  1. В каком состоянии GetStringUTFChars() выполнит копию?
  2. Есть ли способ избежать копирования в GetStringUTFChars()?
  3. Если ответ на вопрос 2. истинен, предлагается ли избежать такой копии?
  • 0
    Это не по теме, но обязательно поймите «модифицированный UTF-8», если вы собираетесь использовать GetStringUTFChars . Возвращаемое значение - более важная часть контракта интерфейса этой функции.
Теги:
optimization
string
jni

2 ответа

3
Лучший ответ

Согласно книге "Основной JNI Java Native Interface", реализация JVM определяет, выполнена ли копия или нет. Так что нет, у вас нет контроля над копированием.

  • 0
    Большое спасибо за ваш ответ :) +1 за ценную цитату! Вы бы порекомендовали эту книгу?
  • 1
    Я рекомендую это. Автор "Роб Гордон".
Показать ещё 3 комментария
1

Реализация 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 будет, вероятно, требуется сделать копию данных.

См. Https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#GetStringCritical_ReleaseStringCritical.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню