C++ 側で、私の関数がjstring
という名前の型の変数を取るとしましょうmyString
。次のように ANSI 文字列に変換できます。
const char* ansiString = env->GetStringUTFChars(myString, 0);
入手方法はありますか
const wchar_t* unicodeString =
...
C++ 側で、私の関数がjstring
という名前の型の変数を取るとしましょうmyString
。次のように ANSI 文字列に変換できます。
const char* ansiString = env->GetStringUTFChars(myString, 0);
入手方法はありますか
const wchar_t* unicodeString =
...
これが誰かを助けるなら...私は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;
}
JNI には GetStringChars() 関数もあります。戻り値の型は const jchar* です。jchar は win32 では 16 ビットなので、wchar_t と互換性があります。それが本当のUTF-16なのか、それとも何か他のものなのかはわかりません...
誰が 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;
}
これは一年前に聞かれたのは知っていますが、他の答えは気に入らないのでとにかく答えます。ソースでこれを行う方法は次のとおりです。
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があり、この場合、このソリューションは機能しません。
移植可能で堅牢なソリューションはiconvwchar_t
を使用することです。ただし、システムが使用するエンコーディング (Windows では UTF-16、多くの Unix システムでは UTF-32 など)を知っておく必要があることを理解しておいてください。
サードパーティ コードへの依存を最小限に抑えたい場合は、独自の UTF-8 コンバーターを手動で作成することもできます。これは、UTF-32 に変換する場合は簡単ですが、サロゲート ペアも処理する必要があるため、UTF-16 ではやや困難です。:-P また、最短でないフォームを拒否するように注意する必要があります。そうしないと、場合によってはセキュリティ バグが発生する可能性があります。
クロス プラットフォーム機能に関心がない場合は、Windows で MultiByteToWideChar 関数または便利なマクロ A2W (参照例) を使用できます。
かなり単純です。ただし、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);
}
env->GetStringChars(myString, 0); を使用するだけです。Javaはその性質上Unicodeを渡します