如何将jstring转换为wchar_t *

时间:2020-03-05 18:54:48  来源:igfitidea点击:

假设在C ++方面,我的函数采用名为myStringjstring类型的变量。我可以将其转换为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);
}