C语言 在 JNI 中将 jchararray 转换为 jstring



我在下面的代码中使用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。

最新更新