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

これは一年前に聞かれたのは知っていますが、他の答えは気に入らないのでとにかく答えます。ソースでこれを行う方法は次のとおりです。

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 に答える
3

移植可能で堅牢なソリューションはiconvwchar_tを使用することです。ただし、システムが使用するエンコーディング (Windows では UTF-16、多くの Unix システムでは UTF-32 など)を知っておく必要があることを理解しておいてください。

サードパーティ コードへの依存を最小限に抑えたい場合は、独自の UTF-8 コンバーターを手動で作成することもできます。これは、UTF-32 に変換する場合は簡単ですが、サロゲート ペアも処理する必要があるため、UTF-16 ではやや困難です。:-P また、最短でないフォームを拒否するように注意する必要があります。そうしないと、場合によってはセキュリティ バグが発生する可能性があります。

于 2008-09-15T23:57:31.947 に答える
1

クロス プラットフォーム機能に関心がない場合は、Windows で MultiByteToWideChar 関数または便利なマクロ A2W (参照) を使用できます。

于 2008-09-15T23:58:13.690 に答える
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

env->GetStringChars(myString, 0); を使用するだけです。Javaはその性質上Unicodeを渡します

于 2009-04-29T22:59:03.340 に答える