Skip to content

Commit

Permalink
Extend default tmmdelegate to support many cxxreactpackages (#41680)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: #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
  • Loading branch information
RSNara authored and facebook-github-bot committed Nov 29, 2023
1 parent 40c7736 commit 9e4fa20
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -47,27 +47,29 @@ 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 {
init {
DefaultSoLoader.maybeLoadSoLibrary()
}

@DoNotStrip @JvmStatic external fun initHybrid(cxxReactPackage: CxxReactPackage?): HybridData?
@DoNotStrip
@JvmStatic
external fun initHybrid(cxxReactPackages: List<CxxReactPackage>): HybridData?
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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&,
Expand All @@ -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() {
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <memory>
#include <string>
#include <vector>

#include <ReactCommon/CxxReactPackage.h>
#include <ReactCommon/JavaTurboModule.h>
Expand All @@ -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();

Expand All @@ -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

0 comments on commit 9e4fa20

Please sign in to comment.