Вернулась ли строка из GetStringUTFChars()
с символом с нулевым завершением? Или мне нужно определить длину, используя GetStringUTFLength
, и null завершает ее сам?
Строка кода Java
Ответ 1
Да, GetStringUTFChars
возвращает строку с нулевым завершением. Тем не менее, я не думаю, что вы должны смириться с этим, вместо этого вы должны найти авторитетный онлайн-источник, который отвечает на этот вопрос.
Давайте начнем с фактической Java Native Interface Specification, где говорится:
Возвращает указатель на массив байтов, представляющий строку в модифицированной кодировке UTF-8. Этот массив действителен до тех пор, пока он не будет выпущен
ReleaseStringUTFChars()
.
О, удивительно, что он не говорит, завершено ли оно нулевым или нет. Мальчик, это кажется огромным недосмотром, и, к счастью, кто-то был достаточно любезен, чтобы зарегистрировать эту ошибку в Sun Java database database еще в 2008 году. ошибка указывает на аналогичную, но различную ошибку документации (которая была закрыта без действий), что говорит о том, что читатели покупают книгу " Интерфейс Java Native: руководство программиста и спецификация", так как есть предположение, что это станет новой спецификацией для JNI.
Но мы ищем авторитетный онлайн-источник, и это не авторитетный (он еще не спецификация), ни онлайн.
К счастью, обзоры для упомянутой книги о некотором популярном розничном магазине онлайн-книг предполагают, что книга свободно доступна в Интернете от Sun, и это, по крайней мере, удовлетворит онлайн-часть. Sun Веб-страница JNI имеет ссылку, которая выглядит мучительно близко, но эта ссылка, к сожалению, не идет туда, где говорится, что она идет.
Поэтому, боюсь, я не могу указать вам на авторитетный источник в Интернете, и вам придется купить книгу (это действительно хорошая книга), где она вам объяснит, что:
Строки UTF-8 всегда заканчиваются символом
'\0'
, тогда как строки Unicode - нет. Чтобы узнать, сколько байтов необходимо для представленияjstring
в формате UTF-8, программисты JNI могут либо вызвать функцию ANSI Cstrlen
по результатуGetStringUTFChars
, либо вызвать функцию JNIGetStringUTFLength
on непосредственно ссылкуjstring
.
(Обратите внимание, что в приведенном выше предложении "Юникод" означает "UTF-16", или, точнее, "внутреннее двухбайтовое строковое представление, используемое Java, хотя поиск доказательств этого остается в качестве упражнения для читателя. )
Ответ 2
Да, строки, возвращаемые GetStringUTFChars(), заканчиваются нулем. Я использую его в своем приложении, поэтому доказал это экспериментально, скажем так. Хотя документация Oracle отстойна, альтернативные источники более информативны: Учебник по Java-интерфейсу Java (JNI)