【发布时间】:2012-12-28 12:26:46
【问题描述】:
几个月前,我编写了一个使用 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 不同时,这将需要修改。
【问题讨论】:
标签: java-native-interface unicode-string widechar