diff --git a/native/android/app/src/cpp/GlobalDBSingleton.cpp b/native/android/app/src/cpp/GlobalDBSingleton.cpp index 828a98766..8081a9c5e 100644 --- a/native/android/app/src/cpp/GlobalDBSingleton.cpp +++ b/native/android/app/src/cpp/GlobalDBSingleton.cpp @@ -1,18 +1,48 @@ #include +#include namespace comm { GlobalDBSingleton GlobalDBSingleton::instance; GlobalDBSingleton::GlobalDBSingleton() : multithreadingEnabled(true), databaseThread(std::make_unique("database")) { } void GlobalDBSingleton::scheduleOrRun(const taskType task) { this->scheduleOrRunCommonImpl(task); } void GlobalDBSingleton::enableMultithreading() { this->enableMultithreadingCommonImpl(); } + +void GlobalDBSingletonJNIHelper::scheduleOrRun( + facebook::jni::alias_ref jThis, + facebook::jni::alias_ref task) { + auto globalTaskRef = facebook::jni::make_global(task); + GlobalDBSingleton::instance.scheduleOrRun( + [globalTaskRef = std::move(globalTaskRef)]() mutable { + auto runTask = [globalTaskRef = std::move(globalTaskRef)]() mutable { + globalTaskRef->run(); + globalTaskRef.release(); + }; + facebook::jni::ThreadScope::WithClassLoader(std::move(runTask)); + }); +} + +void GlobalDBSingletonJNIHelper::enableMultithreading( + facebook::jni::alias_ref jThis) { + GlobalDBSingleton::instance.enableMultithreading(); +} + +void GlobalDBSingletonJNIHelper::registerNatives() { + javaClassStatic()->registerNatives({ + makeNativeMethod( + "scheduleOrRun", GlobalDBSingletonJNIHelper::scheduleOrRun), + makeNativeMethod( + "enableMultithreading", + GlobalDBSingletonJNIHelper::enableMultithreading), + }); +} } // namespace comm diff --git a/native/android/app/src/cpp/jsiInstaller.cpp b/native/android/app/src/cpp/jsiInstaller.cpp index c8b77dd79..aacb415e5 100644 --- a/native/android/app/src/cpp/jsiInstaller.cpp +++ b/native/android/app/src/cpp/jsiInstaller.cpp @@ -1,61 +1,63 @@ #include "jniHelpers.h" #include #include #include #include +#include #include #include #include #include namespace jni = facebook::jni; namespace jsi = facebook::jsi; namespace react = facebook::react; class CommHybrid : public jni::HybridClass { public: static auto constexpr kJavaDescriptor = "Lapp/comm/android/fbjni/CommHybrid;"; static void initHybrid( jni::alias_ref jThis, jlong jsContext, jni::alias_ref jsCallInvokerHolder, comm::HashMap additionalParameters) { jsi::Runtime *rt = (jsi::Runtime *)jsContext; auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); std::shared_ptr nativeModule = std::make_shared(jsCallInvoker); if (rt != nullptr) { rt->global().setProperty( *rt, jsi::PropNameID::forAscii(*rt, "CommCoreModule"), jsi::Object::createFromHostObject(*rt, nativeModule)); } jni::local_ref sqliteFilePathObj = additionalParameters.get("sqliteFilePath"); std::string sqliteFilePath = sqliteFilePathObj->toString(); comm::SQLiteQueryExecutor::initialize(sqliteFilePath); } static void registerNatives() { javaClassStatic()->registerNatives({ makeNativeMethod("initHybrid", CommHybrid::initHybrid), }); } private: friend HybridBase; }; JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) { return jni::initialize(vm, [] { CommHybrid::registerNatives(); comm::GlobalNetworkSingletonJNIHelper::registerNatives(); comm::ThreadOperationsJNIHelper::registerNatives(); comm::MessageOperationsUtilitiesJNIHelper::registerNatives(); + comm::GlobalDBSingletonJNIHelper::registerNatives(); }); } diff --git a/native/android/app/src/main/java/app/comm/android/fbjni/GlobalDBSingleton.java b/native/android/app/src/main/java/app/comm/android/fbjni/GlobalDBSingleton.java new file mode 100644 index 000000000..385a6d04d --- /dev/null +++ b/native/android/app/src/main/java/app/comm/android/fbjni/GlobalDBSingleton.java @@ -0,0 +1,6 @@ +package app.comm.android.fbjni; + +public class GlobalDBSingleton { + public static native void scheduleOrRun(Runnable task); + public static native void enableMultithreading(); +} diff --git a/native/cpp/CommonCpp/NativeModules/InternalModules/GlobalDBSingletonJNIHelper.h b/native/cpp/CommonCpp/NativeModules/InternalModules/GlobalDBSingletonJNIHelper.h new file mode 100644 index 000000000..8a5b0cc6f --- /dev/null +++ b/native/cpp/CommonCpp/NativeModules/InternalModules/GlobalDBSingletonJNIHelper.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include + +namespace comm { +class GlobalDBSingletonJNIHelper + : public facebook::jni::JavaClass { +public: + static auto constexpr kJavaDescriptor = + "Lapp/comm/android/fbjni/GlobalDBSingleton;"; + static void scheduleOrRun( + facebook::jni::alias_ref jThis, + facebook::jni::alias_ref task); + static void enableMultithreading( + facebook::jni::alias_ref jThis); + static void registerNatives(); +}; +} // namespace comm