2017-01-24 5 views
3

jstring (JNI)을 std::string (C++)로 변환하는 방법은 utf8 자입니다?utstv (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

솔루션을 찾을 시간이 많이 있습니다. 나는 길을 찾았습니다 :

자바에서는 유니 코드 문자가 4 바이트 (utf16)로 인코딩됩니다. 따라서 jstring은 컨테이너 문자 utf16이됩니다. std::string은 C++에서 본질적으로 문자가 아닌 문자열이므로 을 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으로에서 문자열을 얻을 수있는이 개 기능을 가지고 있습니다.

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++

이 내 솔루션입니다에 숯불로 변환됩니다 (asciiutf8 문자로 잘 작동)

잘 작동합니다. 시도 해봐.

관련 문제