diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java index d0abc11e6dc..c88b867df23 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java @@ -13,6 +13,7 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.JavaScriptContextHolder; import com.facebook.react.bridge.NativeMap; +import com.facebook.react.bridge.RuntimeExecutor; import com.facebook.react.bridge.queue.MessageQueueThread; import com.facebook.react.fabric.events.EventBeatManager; import com.facebook.react.uimanager.PixelUtil; @@ -35,6 +36,7 @@ public class Binding { private native void installFabricUIManager( long jsContextNativePointer, + RuntimeExecutor runtimeExecutor, Object uiManager, EventBeatManager eventBeatManager, MessageQueueThread jsMessageQueueThread, @@ -72,8 +74,10 @@ public class Binding { public native void driveCxxAnimations(); + // TODO (T67721598) Remove the jsContext param once we've migrated to using RuntimeExecutor public void register( @NonNull JavaScriptContextHolder jsContext, + @NonNull RuntimeExecutor runtimeExecutor, @NonNull FabricUIManager fabricUIManager, @NonNull EventBeatManager eventBeatManager, @NonNull MessageQueueThread jsMessageQueueThread, @@ -82,6 +86,7 @@ public class Binding { fabricUIManager.setBinding(this); installFabricUIManager( jsContext.get(), + runtimeExecutor, fabricUIManager, eventBeatManager, jsMessageQueueThread, diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java index 62e020c7118..8b5b7263fcc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java @@ -74,8 +74,10 @@ public class FabricJSIModuleProvider implements JSIModuleProvider { .getCatalystInstance() .getReactQueueConfiguration() .getJSQueueThread(); + binding.register( mJSContext, + mReactApplicationContext.getCatalystInstance().getRuntimeExecutor(), uiManager, eventBeatManager, jsMessageQueueThread, diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index 63f9c78265d..46a91c37761 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -210,6 +210,7 @@ void Binding::setConstraints( void Binding::installFabricUIManager( jlong jsContextNativePointer, + jni::alias_ref runtimeExecutorHolder, jni::alias_ref javaUIManager, EventBeatManager *eventBeatManager, jni::alias_ref jsMessageQueueThread, @@ -243,15 +244,23 @@ void Binding::installFabricUIManager( auto sharedJSMessageQueueThread = std::make_shared(jsMessageQueueThread); - Runtime *runtime = (Runtime *)jsContextNativePointer; - RuntimeExecutor runtimeExecutor = - [runtime, sharedJSMessageQueueThread]( - std::function &&callback) { - sharedJSMessageQueueThread->runOnQueue( - [runtime, callback = std::move(callback)]() { - callback(*runtime); - }); - }; + bool useRuntimeExecutor = + config->getBool("react_fabric:use_shared_runtime_executor_android"); + + RuntimeExecutor runtimeExecutor; + if (useRuntimeExecutor) { + runtimeExecutor = runtimeExecutorHolder->cthis()->get(); + } else { + Runtime *runtime = (Runtime *)jsContextNativePointer; + runtimeExecutor = + [runtime, sharedJSMessageQueueThread]( + std::function &&callback) { + sharedJSMessageQueueThread->runOnQueue( + [runtime, callback = std::move(callback)]() { + callback(*runtime); + }); + }; + } // TODO: T31905686 Create synchronous Event Beat jni::global_ref localJavaUIManager = javaUIManager_; diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h index 77b6842e47f..27f0fba1b9f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,7 @@ class Binding : public jni::HybridClass, void installFabricUIManager( jlong jsContextNativePointer, + jni::alias_ref runtimeExecutorHolder, jni::alias_ref javaUIManager, EventBeatManager *eventBeatManager, jni::alias_ref jsMessageQueueThread,