解決策を見つけるまでに多くの時間がかかりました。私は方法が見つかりました:
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;
}
解答のセクションを – Danh
に移動してください。とにかく、あなたのコードは例外的にニュートラルではありません。 – Danh
StackOverflowは共有サイトではありません。共有する価値のあるものがあれば、適切なQA形式で投稿してください。共有コードが答える質問を投稿してください。 –