From 9fd1c6872fad571c5059fa7cacf45b43d17a38eb Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Sun, 19 Nov 2023 18:46:12 -0800 Subject: [PATCH] Integrate default tmm delegate with CxxReactPackage (#41464) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41464 Now, DefaultTurboModuleManagerDelegate can be created with a CxxReactPackage. If it exists, DefaultTurobModuleManager will use the CxxReactPackage to create C++-only turbo modules. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D51166524 fbshipit-source-id: 2fdc404e79213d685c4f41b2a152b68226bb71b2 --- .../DefaultTurboModuleManagerDelegate.kt | 16 ++++++++++++++-- .../jni/react/newarchdefaults/CMakeLists.txt | 1 + .../DefaultTurboModuleManagerDelegate.cpp | 17 +++++++++++++++-- .../DefaultTurboModuleManagerDelegate.h | 10 +++++++++- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt index 444cbe7240a..10a7dc7c5d2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt @@ -12,6 +12,8 @@ import com.facebook.proguard.annotations.DoNotStrip import com.facebook.react.ReactPackage import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.runtime.cxxreactpackage.CxxReactPackage /** * A utility class that allows you to simplify the setup of a @@ -20,14 +22,18 @@ import com.facebook.react.bridge.ReactApplicationContext * This class works together with the [DefaultNewArchitectureEntryPoint] and it's C++ implementation * is hosted inside the React Native framework */ +@OptIn(UnstableReactNativeAPI::class) class DefaultTurboModuleManagerDelegate private constructor( context: ReactApplicationContext, packages: List, private val eagerlyInitializedModules: List, + private val cxxReactPackage: CxxReactPackage?, ) : ReactPackageTurboModuleManagerDelegate(context, packages) { - @DoNotStrip external override fun initHybrid(): HybridData? + @DoNotStrip override fun initHybrid() = initHybrid(cxxReactPackage) + + external fun initHybrid(cxxReactPackage: CxxReactPackage?): HybridData? override fun getEagerInitModuleNames(): List { if (unstable_isLazyTurboModuleDelegate()) { @@ -40,14 +46,20 @@ private constructor( class Builder : ReactPackageTurboModuleManagerDelegate.Builder() { private var eagerInitModuleNames: List = emptyList() + private var cxxReactPackage: CxxReactPackage? = null fun setEagerInitModuleNames(eagerInitModuleNames: List): Builder { this.eagerInitModuleNames = eagerInitModuleNames return this } + fun setCxxReactPackage(cxxReactPackage: CxxReactPackage): Builder { + this.cxxReactPackage = cxxReactPackage + return this + } + override fun build(context: ReactApplicationContext, packages: List) = - DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames) + DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames, cxxReactPackage) } @Synchronized diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/CMakeLists.txt index 166c5ed4534..b928ca15839 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/CMakeLists.txt @@ -19,4 +19,5 @@ target_link_libraries(react_newarchdefaults fabricjni react_nativemodule_core react_codegen_rncore + react_cxxreactpackage jsi) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp index c4a14f39c53..86944f2e6c4 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp @@ -11,6 +11,10 @@ namespace facebook::react { +DefaultTurboModuleManagerDelegate::DefaultTurboModuleManagerDelegate( + jni::alias_ref cxxReactPackage) + : cxxReactPackage_(jni::make_global(cxxReactPackage)){}; + std::function( const std::string&, const std::shared_ptr&)> @@ -22,8 +26,10 @@ std::function( DefaultTurboModuleManagerDelegate::javaModuleProvider{nullptr}; jni::local_ref -DefaultTurboModuleManagerDelegate::initHybrid(jni::alias_ref) { - return makeCxxInstance(); +DefaultTurboModuleManagerDelegate::initHybrid( + jni::alias_ref, + jni::alias_ref cxxReactPackage) { + return makeCxxInstance(cxxReactPackage); } void DefaultTurboModuleManagerDelegate::registerNatives() { @@ -36,6 +42,13 @@ void DefaultTurboModuleManagerDelegate::registerNatives() { std::shared_ptr DefaultTurboModuleManagerDelegate::getTurboModule( const std::string& name, const std::shared_ptr& jsInvoker) { + if (cxxReactPackage_) { + auto module = cxxReactPackage_->cthis()->getModule(name, jsInvoker); + if (module) { + return module; + } + } + auto moduleProvider = DefaultTurboModuleManagerDelegate::cxxModuleProvider; if (moduleProvider) { return moduleProvider(name, jsInvoker); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h index fdcf8d00ae9..e175a574bc3 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -22,7 +23,9 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass< static constexpr auto kJavaDescriptor = "Lcom/facebook/react/defaults/DefaultTurboModuleManagerDelegate;"; - static jni::local_ref initHybrid(jni::alias_ref); + static jni::local_ref initHybrid( + jni::alias_ref, + jni::alias_ref); static void registerNatives(); @@ -46,6 +49,11 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass< private: friend HybridBase; using HybridBase::HybridBase; + + jni::global_ref cxxReactPackage_; + + DefaultTurboModuleManagerDelegate( + jni::alias_ref); }; } // namespace facebook::react