在JNI中将JString转换为String时的UTF 8特殊字符

时间:2015-04-09 19:57:33

标签: java android c++ java-native-interface

我正在尝试将字符串转换为JNI中的JString,但是当字符串包含UTF 8特殊字符时,它似乎没有以正确的方式保存。

例如:“Avda。 Espaᡬ1“应该是”Avda。 España1“。

这是我的代码:

jstr= env->NewStringUTF(str.c_str());

有没有办法转换为指定UTF 8字符集的JString?

1 个答案:

答案 0 :(得分:2)

我从某处复制了这些,添加了异常处理。他们在生产中工作。

// jstring to std::wstring
std::wstring jstr2wsz(JNIEnv *env, jstring string)
{
    std::wstring wStr;
    if (string == NULL) 
    {
        return wStr; // empty string
    }

    try
    {
        const jchar *raw = env->GetStringChars(string, NULL);
        if (raw != NULL)
        {
            jsize len = env->GetStringLength(string);
            wStr.assign(raw, raw + len);
            env->ReleaseStringChars(string, raw);
        }
    }
    catch (const std::exception ex)
    {
        std::cout << "EXCEPTION in jstr2wsz translating string input " << string << std::endl;
        std::cout << "exception: " << ex.what() << std::endl;
    }
    return wStr;
}

// std::wstring to jstring
jstring wsz2jstr(JNIEnv *env, std::wstring cstr)
{
    jstring result = nullptr;
    try
    {
        int len = cstr.size();
        jchar* raw = new jchar[len];
        memcpy(raw, cstr.c_str(), len * sizeof(wchar_t));
        result = env->NewString(raw, len);
        delete[] raw;
        return result;
    }
    catch (const std::exception ex)
    {
        std::wcout << L"EXCEPTION in wsz2jstr translating string input " <<     cstr << std::endl;
        std::cout << "exception: " << ex.what() << std::endl;
    }

return result;

}