From 77fe4f087df3a8bd90aa216126f35ab5ab57fdd9 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 20 Sep 2019 10:48:50 -0700 Subject: [PATCH] Introduce CatalystInstance.getNativeCallInvokerHolder() Summary: CatalystInstanceImpl is responsible for creating the NativeModules thread. We therefore expose a method `getNativeCallInvokerHolder()` on this hybrid class to create and give us access to the `CallInvokerHolder` for the NativeModules thread. Reviewed By: PeteTheHeat Differential Revision: D17422164 fbshipit-source-id: 316423847518124115643549fa73a8533d493cd0 --- .../react/bridge/CatalystInstance.java | 10 ++++++-- .../react/bridge/CatalystInstanceImpl.java | 2 ++ .../jni/react/jni/CatalystInstanceImpl.cpp | 23 +++++++++++++++---- .../main/jni/react/jni/CatalystInstanceImpl.h | 5 ++-- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index bcc5376b5d1..96bc4a3491e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -107,11 +107,17 @@ public interface CatalystInstance void addJSIModules(List jsiModules); /** - * Returns a hybrid object that contains a pointer to JSCallInvoker. Required for - * TurboModuleManager initialization. + * Returns a hybrid object that contains a pointer to a JS CallInvoker, which is used to schedule + * work on the JS Thread. Required for TurboModuleManager initialization. */ CallInvokerHolder getJSCallInvokerHolder(); + /** + * Returns a hybrid object that contains a pointer to a Native CallInvoker, which is used to + * schedule work on the NativeModules thread. Required for TurboModuleManager initialization. + */ + CallInvokerHolder getNativeCallInvokerHolder(); + /** * For the time being, we want code relying on the old infra to also work with TurboModules. * Hence, we must provide the TurboModuleRegistry to CatalystInstance so that getNativeModule, diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index be5cf5ac86c..cd42defc22c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -109,6 +109,8 @@ public class CatalystInstanceImpl implements CatalystInstance { public native CallInvokerHolderImpl getJSCallInvokerHolder(); + public native CallInvokerHolderImpl getNativeCallInvokerHolder(); + private CatalystInstanceImpl( final ReactQueueConfigurationSpec reactQueueConfigurationSpec, final JavaScriptExecutor jsExecutor, diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index ceb0caeda96..bf3ce098ce6 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -125,6 +126,9 @@ void CatalystInstanceImpl::registerNatives() { makeNativeMethod( "getJSCallInvokerHolder", CatalystInstanceImpl::getJSCallInvokerHolder), + makeNativeMethod( + "getNativeCallInvokerHolder", + CatalystInstanceImpl::getNativeCallInvokerHolder), makeNativeMethod( "jniHandleMemoryPressure", CatalystInstanceImpl::handleMemoryPressure), @@ -283,13 +287,22 @@ void CatalystInstanceImpl::handleMemoryPressure(int pressureLevel) { jni::alias_ref CatalystInstanceImpl::getJSCallInvokerHolder() { - if (!javaInstanceHolder_) { - jsCallInvoker_ = std::make_shared(instance_); - javaInstanceHolder_ = - jni::make_global(CallInvokerHolder::newObjectCxxArgs(jsCallInvoker_)); + if (!jsCallInvokerHolder_) { + jsCallInvokerHolder_ = + jni::make_global(CallInvokerHolder::newObjectCxxArgs(std::make_shared(instance_))); } - return javaInstanceHolder_; + return jsCallInvokerHolder_; +} + +jni::alias_ref +CatalystInstanceImpl::getNativeCallInvokerHolder() { + if (!nativeCallInvokerHolder_) { + nativeCallInvokerHolder_ = + jni::make_global(CallInvokerHolder::newObjectCxxArgs(std::make_shared(moduleMessageQueue_))); + } + + return nativeCallInvokerHolder_; } } // namespace react diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index a8f7238c8d6..9e6eb717c9b 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -90,6 +90,7 @@ class CatalystInstanceImpl : public jni::HybridClass { NativeArray *arguments); void jniCallJSCallback(jint callbackId, NativeArray *arguments); jni::alias_ref getJSCallInvokerHolder(); + jni::alias_ref getNativeCallInvokerHolder(); void setGlobalVariable(std::string propName, std::string &&jsonValue); jlong getJavaScriptContext(); void handleMemoryPressure(int pressureLevel); @@ -99,8 +100,8 @@ class CatalystInstanceImpl : public jni::HybridClass { std::shared_ptr instance_; std::shared_ptr moduleRegistry_; std::shared_ptr moduleMessageQueue_; - jni::global_ref javaInstanceHolder_; - std::shared_ptr jsCallInvoker_; + jni::global_ref jsCallInvokerHolder_; + jni::global_ref nativeCallInvokerHolder_; }; } // namespace react