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);