如何将jstring转换为wchar_t *
时间:2020-03-05 18:54:48 来源:igfitidea点击:
假设在C ++方面,我的函数采用名为myString
的jstring
类型的变量。我可以将其转换为ANSI字符串,如下所示:
const char* ansiString = env->GetStringUTFChars(myString, 0);
有没有办法
const wchar_t * unicodeString =
...
解决方案
回答
一个可移植且健壮的解决方案是使用iconv,但要了解我们必须知道系统wchar_t使用的编码方式(例如,在Windows上为UTF-16,在许多Unix系统上为UTF-32)。
如果要最大程度地减少对第三方代码的依赖性,还可以手动滚动自己的UTF-8转换器。如果转换为UTF-32很容易,而使用UTF-16则比较困难,因为我们也必须处理代理对。 :-P另外,我们必须小心拒绝非最短格式,否则在某些情况下可能会打开安全漏洞。
回答
如果我们对跨平台功能不感兴趣,则可以在Windows中使用MultiByteToWideChar函数或者有用的宏A2W(请参见示例)。
回答
JNI也具有GetStringChars()函数。返回类型为const jchar *,在Win32上jchar为16位,因此与wchar_t兼容。不知道这是真正的UTF-16还是其他东西...
回答
只需使用env-> GetStringChars(myString,0);
Java本质上通过Unicode
回答
我知道这是一年前提出的,但是我不喜欢其他答案,所以我还是要回答。这是我们在源代码中的处理方式:
wchar_t * JavaToWSZ(JNIEnv* env, jstring string) { if (string == NULL) return NULL; int len = env->GetStringLength(string); const jchar* raw = env->GetStringChars(string, NULL); if (raw == NULL) return NULL; wchar_t* wsz = new wchar_t[len+1]; memcpy(wsz, raw, len*2); wsz[len] = 0; env->ReleaseStringChars(string, raw); return wsz; }
编辑:此解决方案在wchar_t为2字节的平台上很好地工作,某些平台具有4字节的wchar_t,在这种情况下此解决方案将不起作用。
回答
谁释放了wsz?
我会推荐STL!
std::wstring JavaToWSZ(JNIEnv* env, jstring string) { std::wstring value; if (string == NULL) { return value; // empty string } const jchar* raw = env->GetStringChars(string, NULL); if (raw != NULL) { jsize len = env->GetStringLength(string); value.assign(raw, len); env->ReleaseStringChars(string, raw); } return value; }
回答
相当简单。但不要忘记通过ReleaseStringChars释放内存
JNIEXPORT jboolean JNICALL Java_TestClass_test(JNIEnv * env, jobject, jstring string) { const wchar_t * utf16 = (wchar_t *)env->GetStringChars(string, NULL); ... env->ReleaseStringChars(string, utf16); }