几个月前,我编写了一个使用 JNI 封装 C API 的 Java API。C API 使用 char 字符串,我使用 GetStringUTFChars 从 Java 字符串创建 C 字符串。
我忽略了思考非 ASCII 字符可能出现的问题。
从那时起,C API 的创建者为他的每个需要或返回 wchar_t 字符串的 C 函数创建了宽字符等效项。我想更新我的 Java API 以使用这些宽字符函数并克服我在使用非 ASCII 字符时遇到的问题。
研究了 JNI 文档后,我对使用 GetStringChars 或 GetStringRegion 方法的相对优点感到有些困惑。
我知道 wchar_t 字符的大小在 Windows 和 Linux 之间有所不同,并且不确定创建 C 字符串的最有效方法(然后将它们转换回 Java 字符串)。
这是我目前拥有的代码,我认为它创建了一个每个字符两个字节的字符串:
int len;
jchar *Src;
len = (*env)->GetStringLength(env, jSrc);
printf("Length of jSrc is %d\n", len);
Src = (jchar *)malloc((len + 1)*sizeof(jchar));
(*env)->GetStringRegion(env, jSrc, 0, len, Src);
Src[len] = '\0';
但是,当 wchar_t 的大小与 jchar 不同时,这将需要修改。