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
This commit is contained in:
Ramanpreet Nara
2023-11-19 18:46:12 -08:00
committed by Facebook GitHub Bot
parent a2558d15ab
commit 9fd1c6872f
4 changed files with 39 additions and 5 deletions
@@ -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<ReactPackage>,
private val eagerlyInitializedModules: List<String>,
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<String> {
if (unstable_isLazyTurboModuleDelegate()) {
@@ -40,14 +46,20 @@ private constructor(
class Builder : ReactPackageTurboModuleManagerDelegate.Builder() {
private var eagerInitModuleNames: List<String> = emptyList()
private var cxxReactPackage: CxxReactPackage? = null
fun setEagerInitModuleNames(eagerInitModuleNames: List<String>): Builder {
this.eagerInitModuleNames = eagerInitModuleNames
return this
}
fun setCxxReactPackage(cxxReactPackage: CxxReactPackage): Builder {
this.cxxReactPackage = cxxReactPackage
return this
}
override fun build(context: ReactApplicationContext, packages: List<ReactPackage>) =
DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames)
DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames, cxxReactPackage)
}
@Synchronized
@@ -19,4 +19,5 @@ target_link_libraries(react_newarchdefaults
fabricjni
react_nativemodule_core
react_codegen_rncore
react_cxxreactpackage
jsi)
@@ -11,6 +11,10 @@
namespace facebook::react {
DefaultTurboModuleManagerDelegate::DefaultTurboModuleManagerDelegate(
jni::alias_ref<CxxReactPackage::javaobject> cxxReactPackage)
: cxxReactPackage_(jni::make_global(cxxReactPackage)){};
std::function<std::shared_ptr<TurboModule>(
const std::string&,
const std::shared_ptr<CallInvoker>&)>
@@ -22,8 +26,10 @@ std::function<std::shared_ptr<TurboModule>(
DefaultTurboModuleManagerDelegate::javaModuleProvider{nullptr};
jni::local_ref<DefaultTurboModuleManagerDelegate::jhybriddata>
DefaultTurboModuleManagerDelegate::initHybrid(jni::alias_ref<jhybridobject>) {
return makeCxxInstance();
DefaultTurboModuleManagerDelegate::initHybrid(
jni::alias_ref<jhybridobject>,
jni::alias_ref<CxxReactPackage::javaobject> cxxReactPackage) {
return makeCxxInstance(cxxReactPackage);
}
void DefaultTurboModuleManagerDelegate::registerNatives() {
@@ -36,6 +42,13 @@ void DefaultTurboModuleManagerDelegate::registerNatives() {
std::shared_ptr<TurboModule> DefaultTurboModuleManagerDelegate::getTurboModule(
const std::string& name,
const std::shared_ptr<CallInvoker>& jsInvoker) {
if (cxxReactPackage_) {
auto module = cxxReactPackage_->cthis()->getModule(name, jsInvoker);
if (module) {
return module;
}
}
auto moduleProvider = DefaultTurboModuleManagerDelegate::cxxModuleProvider;
if (moduleProvider) {
return moduleProvider(name, jsInvoker);
@@ -8,6 +8,7 @@
#include <memory>
#include <string>
#include <ReactCommon/CxxReactPackage.h>
#include <ReactCommon/JavaTurboModule.h>
#include <ReactCommon/TurboModule.h>
#include <ReactCommon/TurboModuleManagerDelegate.h>
@@ -22,7 +23,9 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass<
static constexpr auto kJavaDescriptor =
"Lcom/facebook/react/defaults/DefaultTurboModuleManagerDelegate;";
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
static jni::local_ref<jhybriddata> initHybrid(
jni::alias_ref<jhybridobject>,
jni::alias_ref<CxxReactPackage::javaobject>);
static void registerNatives();
@@ -46,6 +49,11 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass<
private:
friend HybridBase;
using HybridBase::HybridBase;
jni::global_ref<CxxReactPackage::javaobject> cxxReactPackage_;
DefaultTurboModuleManagerDelegate(
jni::alias_ref<CxxReactPackage::javaobject>);
};
} // namespace facebook::react