// Copyright 2018 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #include "jni/AndroidCommon/AndroidCommon.h" #include #include #include #include #include "Common/StringUtil.h" #include "jni/AndroidCommon/IDCache.h" std::string GetJString(JNIEnv* env, jstring jstr) { 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) { 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) { const jsize size = env->GetArrayLength(array); std::vector result; result.reserve(size); for (jsize i = 0; i < size; ++i) result.push_back(GetJString(env, (jstring)env->GetObjectArrayElement(array, i))); return result; } int OpenAndroidContent(const std::string& uri, const std::string& mode) { JNIEnv* env = IDCache::GetEnvForThread(); const jint fd = env->CallStaticIntMethod(IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerOpenFd(), ToJString(env, uri), ToJString(env, mode)); // We can get an IllegalArgumentException when passing an invalid mode if (env->ExceptionCheck()) { env->ExceptionDescribe(); abort(); } return fd; } bool DeleteAndroidContent(const std::string& uri) { JNIEnv* env = IDCache::GetEnvForThread(); return env->CallStaticBooleanMethod(IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerDelete(), ToJString(env, uri)); }