如何将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); }