Официальный JNI API указывает, делается ли копия при создании jstring из const char *. Вот цитата:
NewStringUTF
jstring NewStringUTF(JNIEnv *env, const char *bytes);
Constructs a new
java.lang.Stringobject from an array of characters in modified UTF-8 encoding.
Означает ли это, что копия const char * сделана или я должен strdup сделать ее сам?
В таких случаях DeleteLocalRef имеет смысл. Когда слишком много неиспользуемых (но не удаленных) локальных ссылок JNI, выделение новых ссылок будет страдать от накладных расходов на просмотр связанного списка JNIHandleBlocks.
Я преобразовал комментарий в ответ. Что касается вашего второго вопроса, спецификация JNI прямо говорит об этом конкретном примере.




NewStringUTF создает новый объект String в Java Heap. Строка поддерживается массивом byte[] или char[] в куче Java и не передает никакие данные вне кучи, которые вы передаете.
Таким образом, вам не нужно strdup, содержимое все равно будет скопировано (и, возможно, преобразовано) в Java Heap.
@apangin Спасибо. Это не имеет прямого отношения к исходному вопросу, но в случае, если я перебираю большой массив и для каждого элемента массива я создаю строку
jstringи устанавливаю ее для некоторого объекта. Является ли хорошей практикой (или необходимой) вызыватьDeleteLocalRefдля созданногоjstringна каждой итерации?