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
This commit is contained in:
Ramanpreet Nara
2023-11-28 16:46:27 -08:00
committed by Facebook GitHub Bot
parent 40c7736a1d
commit 9e4fa20b75
3 changed files with 33 additions and 16 deletions
@@ -28,8 +28,8 @@ private constructor(
context: ReactApplicationContext,
packages: List<ReactPackage>,
private val eagerlyInitializedModules: List<String>,
cxxReactPackage: CxxReactPackage?,
) : ReactPackageTurboModuleManagerDelegate(context, packages, initHybrid(cxxReactPackage)) {
cxxReactPackages: List<CxxReactPackage>,
) : 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<String> = emptyList()
private var cxxReactPackage: CxxReactPackage? = null
private var cxxReactPackages: MutableList<CxxReactPackage> = mutableListOf()
fun setEagerInitModuleNames(eagerInitModuleNames: List<String>): 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<ReactPackage>) =
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<CxxReactPackage>): HybridData?
}
}
@@ -7,13 +7,25 @@
#include "DefaultTurboModuleManagerDelegate.h"
#include <algorithm>
#include <rncore.h>
namespace facebook::react {
DefaultTurboModuleManagerDelegate::DefaultTurboModuleManagerDelegate(
jni::alias_ref<CxxReactPackage::javaobject> cxxReactPackage)
: cxxReactPackage_(jni::make_global(cxxReactPackage)){};
jni::alias_ref<jni::JList<CxxReactPackage::javaobject>::javaobject>
cxxReactPackages)
: cxxReactPackages_() {
cxxReactPackages_.reserve(cxxReactPackages->size());
std::transform(
cxxReactPackages->begin(),
cxxReactPackages->end(),
std::back_inserter(cxxReactPackages_),
[](jni::alias_ref<CxxReactPackage::javaobject> elem) {
return jni::make_global(elem);
});
};
std::function<std::shared_ptr<TurboModule>(
const std::string&,
@@ -28,8 +40,9 @@ std::function<std::shared_ptr<TurboModule>(
jni::local_ref<DefaultTurboModuleManagerDelegate::jhybriddata>
DefaultTurboModuleManagerDelegate::initHybrid(
jni::alias_ref<jclass> jClass,
jni::alias_ref<CxxReactPackage::javaobject> cxxReactPackage) {
return makeCxxInstance(cxxReactPackage);
jni::alias_ref<jni::JList<CxxReactPackage::javaobject>::javaobject>
cxxReactPackages) {
return makeCxxInstance(cxxReactPackages);
}
void DefaultTurboModuleManagerDelegate::registerNatives() {
@@ -42,8 +55,8 @@ void DefaultTurboModuleManagerDelegate::registerNatives() {
std::shared_ptr<TurboModule> DefaultTurboModuleManagerDelegate::getTurboModule(
const std::string& name,
const std::shared_ptr<CallInvoker>& 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) {
@@ -7,6 +7,7 @@
#include <memory>
#include <string>
#include <vector>
#include <ReactCommon/CxxReactPackage.h>
#include <ReactCommon/JavaTurboModule.h>
@@ -25,7 +26,7 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass<
static jni::local_ref<jhybriddata> initHybrid(
jni::alias_ref<jclass>,
jni::alias_ref<CxxReactPackage::javaobject>);
jni::alias_ref<jni::JList<CxxReactPackage::javaobject>::javaobject>);
static void registerNatives();
@@ -50,10 +51,11 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass<
friend HybridBase;
using HybridBase::HybridBase;
jni::global_ref<CxxReactPackage::javaobject> cxxReactPackage_;
std::vector<jni::global_ref<CxxReactPackage::javaobject>> cxxReactPackages_;
DefaultTurboModuleManagerDelegate(
jni::alias_ref<CxxReactPackage::javaobject> cxxReactPackage);
jni::alias_ref<jni::JList<CxxReactPackage::javaobject>::javaobject>
cxxReactPackage);
};
} // namespace facebook::react