我在下面的代码中使用JNI将jchararray转换为jstring,但我在Linux中只得到了第一个字符。
char *carr =(char*)malloc(length+1);
(*env)->GetCharArrayRegion(env, ch, 0, length, carr);
return (*env)->NewStringUTF(env, carr);
GetCharArrayRegion
返回Java char,即UTF-16代码点。jchar
在 JNI 中,并且它们不是以 null 结尾的,并且您不能使用NewStringUTF
,它需要一个以 null 结尾的字符串,其中包含修改后的UTF-8 编码中的字节。
首先,分配正确的内存量
jchar *carr = malloc(length * sizeof(jchar));
然后执行GetCharArrayRegion
(*env)->GetCharArrayRegion(env, ch, 0, length, carr);
然后请注意,您有一个 UTF-16 字符数组。如果第一个字符属于 ASCII 范围,并且体系结构是小端序,则预计您只会"获取第一个字符",因为第一个jchar
的 MSB字节将为零,NewStringUTF
会将其视为终止符。请改用NewString
:
return (*env)NewString(env, carr, length);
你应该使用NewString((函数,它采用jchar数组及其长度。NewStringUTF(( 函数将 UTF-8编码的 C 字符串作为输入。
有关更多详细信息,请参阅 https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-4.2。