diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt index 10c03016b..13df3df88 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt @@ -698,7 +698,7 @@ object NativeLibrary { val dirSep = "/" - val pathSegment = uri.lastPathSegment!! + val pathSegment = uri.lastPathSegment ?: return "" val virtualPath = pathSegment.substringAfter(":") if (pathSegment.startsWith("primary:")) { // User directory is located in primary storage @@ -723,7 +723,8 @@ object NativeLibrary { fun getUserDirectory(): String { val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) - return getNativePath(preferences.getString("CITRA_DIRECTORY", "")!!.toUri()) + val userDirectoryUri = preferences.getString("CITRA_DIRECTORY", "")!!.toUri() + return getNativePath(userDirectoryUri) } @Keep diff --git a/src/common/android_storage.cpp b/src/common/android_storage.cpp index 033baaeeb..efc7404ae 100644 --- a/src/common/android_storage.cpp +++ b/src/common/android_storage.cpp @@ -163,13 +163,27 @@ std::optional GetUserDirectory() { throw std::runtime_error( "Unable to locate user directory: Function with ID 'get_user_directory' is missing"); } + auto env = GetEnvForThread(); - auto j_user_directory = - (jstring)(env->CallStaticObjectMethod(native_library, get_user_directory, nullptr)); - auto result = env->GetStringUTFChars(j_user_directory, nullptr); - if (result == "") { + + jstring j_user_directory = + (jstring)env->CallStaticObjectMethod(native_library, get_user_directory); + + if (env->ExceptionCheck() || j_user_directory == nullptr) { + env->ExceptionClear(); return std::nullopt; } + + const char* chars = env->GetStringUTFChars(j_user_directory, nullptr); + + std::string result = chars ? chars : ""; + + env->ReleaseStringUTFChars(j_user_directory, chars); + + if (result.empty()) { + return std::nullopt; + } + return result; } @@ -296,7 +310,7 @@ bool MoveAndRenameFile(const std::string& src_full_path, const std::string& dest std::string TranslateFilePath(const std::string& filepath) { std::optional userDirLocation = GetUserDirectory(); if (userDirLocation) { - return *userDirLocation + "/" + filepath; + return *userDirLocation + filepath; } return ""; }