我有一个Java应用程序,通过JNI使用C++ DLL。其中一些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不再创建Strings,而是传递带有原始字符串数据的jbyteArrays。Java使用String(byte[] bytes,String charsetName)构造函数实际创建String。
这种方法唯一的问题是我不确定要使用哪个字符集名称。 WCHARs的长度为2字节,因此我非常确定它是UTF-16,但在Java端有3个可能性。 UTF-16,UTF-16BE和UTF-16LE。 我没有找到任何告诉我字节顺序的文档,但我可以通过快速测试来解决它。
是否有更好的方法?如果可能,我希望在DLL内继续构造jstring对象,因为这样我就不必修改那些方法的任何用法。 但是,NewString JNI方法不会采用charset标识符。
目前,该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不再创建Strings,而是传递带有原始字符串数据的jbyteArrays。Java使用String(byte[] bytes,String charsetName)构造函数实际创建String。
这种方法唯一的问题是我不确定要使用哪个字符集名称。 WCHARs的长度为2字节,因此我非常确定它是UTF-16,但在Java端有3个可能性。 UTF-16,UTF-16BE和UTF-16LE。 我没有找到任何告诉我字节顺序的文档,但我可以通过快速测试来解决它。
是否有更好的方法?如果可能,我希望在DLL内继续构造jstring对象,因为这样我就不必修改那些方法的任何用法。 但是,NewString JNI方法不会采用charset标识符。