13

假设在 C++ 端,我的函数采用jstring名为myString. 我可以将其转换为 ANSI 字符串,如下所示:

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

有没有办法得到

const wchar_t* unicodeString =...

4

10 回答 10

13

如果这对某人有帮助...我已将此功能用于 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;
}
于 2012-02-01T17:08:03.337 回答
4

JNI 也有一个 GetStringChars() 函数。返回类型是 const jchar*,jchar 在 win32 上是 16 位的,因此在某种程度上与 wchar_t 兼容。不确定它是真正的 UTF-16 还是其他的东西......

于 2008-09-16T02:04:03.123 回答
4

谁释放了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;
}
于 2010-02-19T10:48:26.520 回答
3

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

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

于 2008-09-15T23:57:31.947 回答
3

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

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 在这种情况下此解决方案将不起作用。

于 2009-11-03T10:36:39.970 回答
1

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

于 2008-09-15T23:58:13.690 回答
0

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

于 2009-04-29T22:59:03.340 回答
0

相当简单。但不要忘记通过 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);
}
于 2010-11-11T12:38:08.817 回答
0

我尝试 jstring->char->wchar_t

char* js2c(JNIEnv* env, jstring jstr)
{
    char* rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("utf-8");
    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
    jsize alen = env->GetArrayLength(barr);
    jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0)
    {
        rtn = (char*)malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements(barr, ba, 0);
    return rtn;
}

jstring c2js(JNIEnv* env, const char* str) {
    jstring rtn = 0;
    int slen = strlen(str);
    unsigned short * buffer = 0;
    if (slen == 0)
        rtn = (env)->NewStringUTF(str);
    else {
        int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);
        buffer = (unsigned short *)malloc(length * 2 + 1);
        if (MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length) > 0)
            rtn = (env)->NewString((jchar*)buffer, length);
        free(buffer);
    }
    return rtn;
}



jstring w2js(JNIEnv *env, wchar_t *src)
{
    size_t len = wcslen(src) + 1;
    size_t converted = 0;
    char *dest;
    dest = (char*)malloc(len * sizeof(char));
    wcstombs_s(&converted, dest, len, src, _TRUNCATE);

    jstring dst = c2js(env, dest);
    return dst;
}

wchar_t *js2w(JNIEnv *env, jstring src) {

    char *dest = js2c(env, src);
    size_t len = strlen(dest) + 1;
    size_t converted = 0;
    wchar_t *dst;
    dst = (wchar_t*)malloc(len * sizeof(wchar_t));
    mbstowcs_s(&converted, dst, len, dest, _TRUNCATE);
    return dst;
}
于 2018-12-10T08:52:54.680 回答
0

这是我如何转换jstringLPWSTR.

const char* nativeString = env->GetStringUTFChars(javaString, 0);
size_t size = strlen(nativeString) + 1;
LPWSTR lpwstr = new wchar_t[size];
size_t outSize;
mbstowcs_s(&outSize, lpwstr, size, nativeString, size - 1);
于 2019-07-15T05:25:03.713 回答