From 9e4fa20b7546febb6aa668bd0053914ecd5d8638 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 28 Nov 2023 16:46:27 -0800 Subject: [PATCH] Extend default tmmdelegate to support many cxxreactpackages (#41680) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41680 Just like how React Native can have n ReactPackages, it will support n CxxReactPackages. This way, many applications can share common CxxReactPackages. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D51484844 fbshipit-source-id: b9b70cab719e80a7ff7e635057d710f1a86fb1c9 --- .../DefaultTurboModuleManagerDelegate.kt | 16 ++++++------ .../DefaultTurboModuleManagerDelegate.cpp | 25 ++++++++++++++----- .../DefaultTurboModuleManagerDelegate.h | 8 +++--- 3 files changed, 33 insertions(+), 16 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 ad38bb31f10..a8644376293 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 @@ -28,8 +28,8 @@ private constructor( context: ReactApplicationContext, packages: List, private val eagerlyInitializedModules: List, - cxxReactPackage: CxxReactPackage?, -) : ReactPackageTurboModuleManagerDelegate(context, packages, initHybrid(cxxReactPackage)) { + cxxReactPackages: List, +) : ReactPackageTurboModuleManagerDelegate(context, packages, initHybrid(cxxReactPackages)) { override fun initHybrid(): HybridData? { throw UnsupportedOperationException( @@ -47,20 +47,20 @@ private constructor( class Builder : ReactPackageTurboModuleManagerDelegate.Builder() { private var eagerInitModuleNames: List = emptyList() - private var cxxReactPackage: CxxReactPackage? = null + private var cxxReactPackages: MutableList = mutableListOf() fun setEagerInitModuleNames(eagerInitModuleNames: List): Builder { this.eagerInitModuleNames = eagerInitModuleNames return this } - fun setCxxReactPackage(cxxReactPackage: CxxReactPackage): Builder { - this.cxxReactPackage = cxxReactPackage + fun addCxxReactPackage(cxxReactPackage: CxxReactPackage): Builder { + this.cxxReactPackages.add(cxxReactPackage) return this } override fun build(context: ReactApplicationContext, packages: List) = - DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames, cxxReactPackage) + DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames, cxxReactPackages) } companion object { @@ -68,6 +68,8 @@ private constructor( DefaultSoLoader.maybeLoadSoLibrary() } - @DoNotStrip @JvmStatic external fun initHybrid(cxxReactPackage: CxxReactPackage?): HybridData? + @DoNotStrip + @JvmStatic + external fun initHybrid(cxxReactPackages: List): HybridData? } } 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 fc480af328b..e202896abc7 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 @@ -7,13 +7,25 @@ #include "DefaultTurboModuleManagerDelegate.h" +#include + #include namespace facebook::react { DefaultTurboModuleManagerDelegate::DefaultTurboModuleManagerDelegate( - jni::alias_ref cxxReactPackage) - : cxxReactPackage_(jni::make_global(cxxReactPackage)){}; + jni::alias_ref::javaobject> + cxxReactPackages) + : cxxReactPackages_() { + cxxReactPackages_.reserve(cxxReactPackages->size()); + std::transform( + cxxReactPackages->begin(), + cxxReactPackages->end(), + std::back_inserter(cxxReactPackages_), + [](jni::alias_ref elem) { + return jni::make_global(elem); + }); +}; std::function( const std::string&, @@ -28,8 +40,9 @@ std::function( jni::local_ref DefaultTurboModuleManagerDelegate::initHybrid( jni::alias_ref jClass, - jni::alias_ref cxxReactPackage) { - return makeCxxInstance(cxxReactPackage); + jni::alias_ref::javaobject> + cxxReactPackages) { + return makeCxxInstance(cxxReactPackages); } void DefaultTurboModuleManagerDelegate::registerNatives() { @@ -42,8 +55,8 @@ void DefaultTurboModuleManagerDelegate::registerNatives() { std::shared_ptr DefaultTurboModuleManagerDelegate::getTurboModule( const std::string& name, const std::shared_ptr& jsInvoker) { - if (cxxReactPackage_) { - auto cppPart = cxxReactPackage_->cthis(); + for (const auto& cxxReactPackage : cxxReactPackages_) { + auto cppPart = cxxReactPackage->cthis(); if (cppPart) { auto module = cppPart->getModule(name, jsInvoker); if (module) { 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 687a23b0c29..099c245f574 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 @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -25,7 +26,7 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass< static jni::local_ref initHybrid( jni::alias_ref, - jni::alias_ref); + jni::alias_ref::javaobject>); static void registerNatives(); @@ -50,10 +51,11 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass< friend HybridBase; using HybridBase::HybridBase; - jni::global_ref cxxReactPackage_; + std::vector> cxxReactPackages_; DefaultTurboModuleManagerDelegate( - jni::alias_ref cxxReactPackage); + jni::alias_ref::javaobject> + cxxReactPackage); }; } // namespace facebook::react