我有一个通过 JNI 使用 C++ DLL 的 Java 应用程序。一些 DLL 的方法采用字符串参数,其中一些方法也返回包含字符串的对象。
目前 DLL 不支持 Unicode,因此字符串处理相当简单:
- Java 调用 String.getBytes() 并将结果数组传递给 DLL,DLL 只是将数据视为 char*。
- DLL 使用 NewStringUTF() 从 const char* 创建 jstring。
我现在正在修改 DLL 以支持 Unicode,切换到使用 TCHAR 类型(定义 UNICODE 时使用 windows 的 WCHAR 数据类型)。修改 DLL 进展顺利,但我不确定如何修改代码的 JNI 部分。
我现在唯一能想到的是:
- Java 调用 String.getBytes(String charsetName) 并将结果数组传递给 DLL,DLL 将数据视为 wchar_t*。
- DLL 不再创建字符串,而是将 jbyteArrays 与原始字符串数据一起传递。Java 使用 String(byte[] bytes, String charsetName) 构造函数来实际创建字符串。
这种方法的唯一问题是我不确定要使用什么字符集名称。WCHAR 的长度为 2 字节,所以我很确定它是 UTF-16,但在 java 端有 3 个可能性。UTF-16、UTF-16BE 和 UTF-16LE。我还没有找到任何文档告诉我字节顺序是什么,但我可能可以通过一些快速测试来弄清楚。
有没有更好的办法?如果可能的话,我想继续在 DLL 中构造 jstring 对象,因为这样我就不必修改这些方法的任何用法。但是,NewString JNI 方法不采用字符集标识符。