Android JNI - 将 jstring 转换为 wchar_t 的可靠方法

标签 android android-ndk java-native-interface

在我的 Android JNI 代码中,我需要将 jstring 转换为 wchar_t。我找到的最接近的引用文献是 How do I convert jstring to wchar_t *

可以使用以下代码获取 jchar* 和长度:

const jchar *raw = env->GetStringChars(string, 0);
jsize len = env->GetStringLength(string);

wchar_t* wStr = new wchar_t[len+1];

我似乎无法使用 wcncpy 将“raw”复制到“wStr”中。虽然 jchar 的长度为 2 个字节,但在所有现代版本的 Android 操作系统上,wchar_t 的长度为 4 个字节。

一种选择是在 for 循环中一次复制一个字符:

for(int i=0;i<len;i++) {
    wStr[i] = raw[i];
}
wStr[len] = 0;

另一个选项是调用 env->GetStringUTFChars() 并使用 iconv_* 例程转换为 wchar_t 类型。

有人可以确认选项 1 是否有效吗?希望我不必诉诸选项 2。还有更好的选择吗?问候。

最佳答案

wchar_t 指定元素大小,但不指定字符集或编码。既然您询问的是 32 位元素,我们可以假设您想要使用 Unicode/UTF-32 吗?无论如何,一旦您决定需要哪种编码,标准 Java 库就可以胜任这项任务。

使用 String.getBytes()重载以获取字节数组。 (如果您有选择的话,在 Java 中而不是在 JNI 中执行此操作更容易。)一旦有了 jbyteArray,您就可以将其复制到 C 缓冲区并转换为 wchar_t *

在 Android 上,您可能需要 Unicode/UTF-8。但它有一个 8 位代码单元,因此您可能不会询问 wchar_t。 (顺便说一句,UTF-8 中的字符可能需要 1 个或更多字节。)

关于Android JNI - 将 jstring 转换为 wchar_t 的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120162/

相关文章:

c - Google-NDK/在没有任何 JNI 交互的情况下编译命令行 C 应用程序

java, System.loadlibrary ("someDLLFile") 获取未统计的链接错误

android - Facebook 式的弹出式操作方法?

android - 在 Android Studio 中找不到 CMake

java - Android:读取txt文件时出现NullPointerException

Android - native 套接字在第一次尝试时不删除 3G sleep 模式

java - 将 Java ArrayList<String> 传递给 JNI C 函数并在 C 中打印列表

java - C 和 C++ 中的 JNI 调用不同?

android - Android SDK 中的 'dx' 工具在哪里?

java - android phonegap cordova webview 事件