相关疑难解决方法(0)

如何将jstring转换为wchar_t*

假设在C++方面,我的函数采用了一个jstring名为的变量myString.我可以将它转换为ANSI字符串,如下所示:

const char* ansiString = env->GetStringUTFChars(myString, 0);
Run Code Online (Sandbox Code Playgroud)

有没有办法得到

const wchar_t* unicodeString = ...

c++ java java-native-interface

12
推荐指数
2
解决办法
2万
查看次数

通过JNI将双字节(WCHAR)字符串从C++传递到Java

我有一个通过JNI使用C++ DLL的Java应用程序.一些DLL的方法接受字符串参数,其中一些返回包含字符串的对象.

目前DLL不支持Unicode,因此字符串处理相当容易:

  • Java调用String.getBytes()并将结果数组传递给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)构造函数来实际创建String.

这种方法的唯一问题是我不确定要使用什么字符集名称.WCHAR是2个字节长,所以我很确定它是UTF-16,但是在java方面有3个可能性.UTF-16,UTF-16BE和UTF-16LE.我没有找到任何文档告诉我字节顺序是什么,但我可以从一些快速测试中找出它.

有没有更好的办法?如果可能的话,我想继续在DLL中构造jstring对象,因为这样我就不必修改那些方法的任何用法.但是,NewString JNI方法不采用字符集标识符.

java unicode java-native-interface visual-c++

7
推荐指数
1
解决办法
8249
查看次数

标签 统计

java ×2

java-native-interface ×2

c++ ×1

unicode ×1

visual-c++ ×1