2017-01-24 9 views
3

jstring(JNI)をstd::string(C++)に変換する方法をutf8文字で入力しますか?jstring(JNI)からutf8文字を含むstd :: string(C++)

これは私のコードです。それは非utf8文字で動作しましたが、utf8文字では間違っています。

std::string jstring2string(JNIEnv *env, jstring jStr){ 
    const char *cstr = env->GetStringUTFChars(jStr, NULL); 
    std::string str = std::string(cstr); 
    env->ReleaseStringUTFChars(jStr, str); 
    return str; 
} 
+1

解答のセクションを – Danh

+0

に移動してください。とにかく、あなたのコードは例外的にニュートラルではありません。 – Danh

+1

StackOverflowは共有サイトではありません。共有する価値のあるものがあれば、適切なQA形式で投稿してください。共有コードが答える質問を投稿してください。 –

答えて

6

解決策を見つけるまでに多くの時間がかかりました。私は方法が見つかりました:

Javaでは、ユニコード文字は4バイト(utf16)でエンコードされます。 jstringはコンテナ文字utf16になります。 std::stringは本質的には文字列ではなく文字列であるため、をJNIからc++に渡す場合は、utf16をバイトに変換しています。

// Returns a pointer to the array of Unicode characters of the string. 
// This pointer is valid until ReleaseStringchars() is called. 
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy); 


// Returns a pointer to an array of bytes representing the string 
// in modified UTF-8 encoding. This array is valid until it is released 
// by ReleaseStringUTFChars(). 
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy); 

GetStringUTFChars、それはmodified utf8を返します。文書JNI functions

は、我々はJSTRINGから文字列を取得するための2つの機能を持っています。

std::string jstring2string(JNIEnv *env, jstring jStr) { 
    if (!jStr) 
     return ""; 

    const jclass stringClass = env->GetObjectClass(jStr); 
    const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B"); 
    const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jStr, getBytes, env->NewStringUTF("UTF-8")); 

    size_t length = (size_t) env->GetArrayLength(stringJbytes); 
    jbyte* pBytes = env->GetByteArrayElements(stringJbytes, NULL); 

    std::string ret = std::string((char *)pBytes, length); 
    env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT); 

    env->DeleteLocalRef(stringJbytes); 
    env->DeleteLocalRef(stringClass); 
    return ret; 
} 
+0

C++コードでのJavaの反映があるため、パフォーマンスが低下します – York

0
jboolean isCopy; 
const char *convertedValue = (env)->GetStringUTFChars(yourJStringParam, &isCopy); 

GetStringChars jbyte *を返します、我々はjbytesから文字コードを読み取って、C++

これは私の解決策がある中でcharに変換します(asciiutf8文字でうまく働いていました)

これはうまく動作します。試してみる。

関連する問題