솔루션을 찾을 시간이 많이 있습니다. 나는 길을 찾았습니다 :
자바에서는 유니 코드 문자가 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;
}
해결책을 – Danh
섹션으로 이동하십시오. 나에게도 코드는 예외가 아닙니다. – Danh
StackOverflow는 공유 사이트가 아닙니다. 공유 할만한 가치가있는 것이 있으면 적합한 QA 형식으로 게시하십시오. 공유 코드가 응답하는 질문을 게시하십시오. –