From f5da6e07d7405d89cc550b8c02f39a432f7888a3 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 28 Jun 2020 19:16:23 +0200 Subject: Android: Use correct encoding when converting strings The functions with "UTF" in the name use "modified UTF-8" rather than the standard UTF-8 which Dolphin uses, at least according to Oracle's documentation, so it is incorrect for us to use them. This change fixes the problem by converting between UTF-8 and UTF-16 manually instead of letting JNI do it for us. --- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'Source/Android/jni/AndroidCommon/AndroidCommon.cpp') diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index cb7b9ff073..1f9973d451 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -5,25 +5,28 @@ #include "jni/AndroidCommon/AndroidCommon.h" #include +#include #include #include +#include "Common/StringUtil.h" + std::string GetJString(JNIEnv* env, jstring jstr) { - std::string result = ""; - if (!jstr) - return result; - - const char* s = env->GetStringUTFChars(jstr, nullptr); - result = s; - env->ReleaseStringUTFChars(jstr, s); - return result; + const jchar* jchars = env->GetStringChars(jstr, nullptr); + const jsize length = env->GetStringLength(jstr); + const std::u16string_view string_view(reinterpret_cast(jchars), length); + const std::string converted_string = UTF16ToUTF8(string_view); + env->ReleaseStringChars(jstr, jchars); + return converted_string; } jstring ToJString(JNIEnv* env, const std::string& str) { - return env->NewStringUTF(str.c_str()); + const std::u16string converted_string = UTF8ToUTF16(str); + return env->NewString(reinterpret_cast(converted_string.data()), + converted_string.size()); } std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array) -- cgit v1.2.3