如何将jstring转换为wchar_t *

假设在C ++方面,我的函数接受一个名为myString jstring类型的变量。 我可以将它转换为ANSI字符串,如下所示:

 const char* ansiString = env->GetStringUTFChars(myString, 0); 

有没有办法得到

const wchar_t* unicodeString =

如果这有助于某人…我已将此function用于Android项目:

 std::wstring Java_To_WStr(JNIEnv *env, jstring string) { std::wstring value; const jchar *raw = env->GetStringChars(string, 0); jsize len = env->GetStringLength(string); const jchar *temp = raw; while (len > 0) { value += *(temp++); len--; } env->ReleaseStringChars(string, raw); return value; } 

一个改进的解决方案可能是(感谢您的反馈):

 std::wstring Java_To_WStr(JNIEnv *env, jstring string) { std::wstring value; const jchar *raw = env->GetStringChars(string, 0); jsize len = env->GetStringLength(string); value.assign(raw, raw + len); env->ReleaseStringChars(string, raw); return value; } 

谁解放了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; } 

一个可移植且强大的解决方案是使用iconv ,理解你必须知道你的系统wchar_t使用什么编码(例如,Windows上的UTF-16,许多Unix系统上的UTF-32)。

如果您想最大限度地减少对第三方代码的依赖,您也可以手动滚动自己的UTF-8转换器。 如果使用UTF-16转换为UTF-32,这很容易,因为您还必须处理代理对。 :-P此外,您必须小心拒绝非最短的表单,否则在某些情况下它可能会打开安全漏洞。

JNI也有一个GetStringChars()函数。 返回类型是const jchar *,jchar在win32上是16位,因此以与wchar_t兼容的方式。 不确定它是真正的UTF-16还是别的…

我知道这是在一年前被问到的,但我不喜欢其他的答案,所以无论如何我都会回答。 以下是我们在源代码中的工作方式:

 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,在这种情况下,此解决方案将无法正常工作。

如果我们对跨平台能力不感兴趣,可以在Windows中使用MultiByteToWideChar函数或有用的宏A2W(参见示例 )。

只需使用env-> GetStringChars(myString,0); Java通过它的本质传递Unicode

相当简单。 但是不要忘记释放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); }