конвертировать jchararray в jstring в JNI - PullRequest
0 голосов
/ 20 мая 2018

Я использую код JNI ниже для преобразования jchararray в jstring, но я получаю только первый символ в Linux.

 char *carr =(char*)malloc(length+1);
(*env)->GetCharArrayRegion(env, ch, 0, length, carr);
return  (*env)->NewStringUTF(env, carr);

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

GetCharArrayRegion возвращает символы Java, т. Е. UTF-16 кодовые точки.И jchar s в JNI, и они не заканчиваются нулем, и вы не можете использовать NewStringUTF, который ожидает строку с нулевым окончанием, содержащую байты в измененном UTFКодировка -8.

Сначала выделите правильный объем памяти

jchar *carr = malloc(length * sizeof(jchar));

Затем выполните GetCharArrayRegion

(*env)->GetCharArrayRegion(env, ch, 0, length, carr);

Затем обратите внимание, что у вас есть массив UTF-16 символов.Если первый символ попадает в диапазон ASCII, а архитектура имеет младший порядок, ожидается, что вы просто «получите первый символ», потому что MSB байт первого jchar будетбудет ноль, и NewStringUTF будет считать это терминатором.Используйте NewString вместо:

return (*env)NewString(env, carr, length);
0 голосов
/ 20 мая 2018

Вы должны использовать функцию NewString () , которая принимает массив jchar и его длину.Функция NewStringUTF () принимает строку C в кодировке UTF-8 в качестве ввода.

Подробнее см. https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-4.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...