diff --git a/src/android/app/src/main/cpp/AndroidFilesystemCallbacks.h b/src/android/app/src/main/cpp/AndroidFilesystemCallbacks.h index c9afd4e3..4f26dd5c 100644 --- a/src/android/app/src/main/cpp/AndroidFilesystemCallbacks.h +++ b/src/android/app/src/main/cpp/AndroidFilesystemCallbacks.h @@ -14,12 +14,11 @@ class AndroidFilesystemCallbacks : public FilesystemAndroid::FilesystemCallbacks bool callBooleanFunction(const std::filesystem::path& uri, jmethodID methodId) { bool result = false; - std::thread([&, this]() { - JNIUtils::ScopedJNIENV env; + JNIUtils::fiberSafeJNICall([&](JNIEnv* env) { jstring uriString = JNIUtils::toJString(env, uri); result = env->CallStaticBooleanMethod(*m_fileUtilClass, methodId, uriString); env->DeleteLocalRef(uriString); - }).join(); + }); return result; } @@ -38,20 +37,18 @@ class AndroidFilesystemCallbacks : public FilesystemAndroid::FilesystemCallbacks int openContentUri(const std::filesystem::path& uri) override { int fd = -1; - std::thread([&, this]() { - JNIUtils::ScopedJNIENV env; + JNIUtils::fiberSafeJNICall([&](JNIEnv* env) { jstring uriString = JNIUtils::toJString(env, uri); fd = env->CallStaticIntMethod(*m_fileUtilClass, m_openContentUriMid, uriString); env->DeleteLocalRef(uriString); - }).join(); + }); return fd; } std::vector listFiles(const std::filesystem::path& uri) override { std::vector paths; - std::thread([&, this]() { - JNIUtils::ScopedJNIENV env; + JNIUtils::fiberSafeJNICall([&](JNIEnv* env) { jstring uriString = JNIUtils::toJString(env, uri); jobjectArray pathsObjArray = static_cast(env->CallStaticObjectMethod(*m_fileUtilClass, m_listFilesMid, uriString)); env->DeleteLocalRef(uriString); @@ -64,7 +61,7 @@ class AndroidFilesystemCallbacks : public FilesystemAndroid::FilesystemCallbacks env->DeleteLocalRef(pathStr); } env->DeleteLocalRef(pathsObjArray); - }).join(); + }); return paths; } diff --git a/src/android/app/src/main/cpp/AndroidSwkbdCallbacks.cpp b/src/android/app/src/main/cpp/AndroidSwkbdCallbacks.cpp index 21a7c819..270248d3 100644 --- a/src/android/app/src/main/cpp/AndroidSwkbdCallbacks.cpp +++ b/src/android/app/src/main/cpp/AndroidSwkbdCallbacks.cpp @@ -11,17 +11,16 @@ AndroidSwkbdCallbacks::AndroidSwkbdCallbacks() void AndroidSwkbdCallbacks::showSoftwareKeyboard(const std::string& initialText, sint32 maxLength) { - std::thread([&, this]() { - JNIUtils::ScopedJNIENV env; + JNIUtils::fiberSafeJNICall([&](JNIEnv* env) { jstring j_initialText = JNIUtils::toJString(env, initialText); JNIUtils::ScopedJNIENV()->CallStaticVoidMethod(*m_emulationActivityClass, m_showSoftwareKeyboardMethodID, j_initialText, maxLength); env->DeleteLocalRef(j_initialText); - }).join(); + }); } void AndroidSwkbdCallbacks::hideSoftwareKeyboard() { - std::thread([this]() { - JNIUtils::ScopedJNIENV()->CallStaticVoidMethod(*m_emulationActivityClass, m_hideSoftwareKeyboardMethodID); - }).join(); + JNIUtils::fiberSafeJNICall([&](JNIEnv* env) { + env->CallStaticVoidMethod(*m_emulationActivityClass, m_hideSoftwareKeyboardMethodID); + }); } diff --git a/src/android/app/src/main/cpp/JNIUtils.cpp b/src/android/app/src/main/cpp/JNIUtils.cpp index c3019c01..00dbaf44 100644 --- a/src/android/app/src/main/cpp/JNIUtils.cpp +++ b/src/android/app/src/main/cpp/JNIUtils.cpp @@ -87,3 +87,11 @@ jobject JNIUtils::createJavaStringArrayList(JNIEnv* env, const std::vector& func) +{ + std::thread([&]() { + ScopedJNIENV env; + func(*env); + }).join(); +} diff --git a/src/android/app/src/main/cpp/JNIUtils.h b/src/android/app/src/main/cpp/JNIUtils.h index 730fdbe3..04e0253a 100644 --- a/src/android/app/src/main/cpp/JNIUtils.h +++ b/src/android/app/src/main/cpp/JNIUtils.h @@ -190,4 +190,6 @@ namespace JNIUtils env->DeleteLocalRef(javaClass); return obj; } + + void fiberSafeJNICall(const std::function& func); } // namespace JNIUtils