From 4cade2ea0634c073c5b36a78d5eba56dad29a63a Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Mon, 7 Nov 2022 07:22:43 -0800 Subject: [PATCH] Provide easy regristration of C++ TurboModules in rn-tester Android (#35225) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35225 Changelog: [Android] [Changed] - Provide easy regristration of C++ TurboModules in rn-tester Android Differential Revision: D41069277 fbshipit-source-id: bbcad083ee663887877b1bb2a250fccfbdfc34f5 --- .../cmake-utils/default-app-setup/OnLoad.cpp | 15 ++++++++++--- .../DefaultTurboModuleManagerDelegate.cpp | 21 +++++++++++++------ .../DefaultTurboModuleManagerDelegate.h | 7 ++++++- .../android/app/src/main/jni/OnLoad.cpp | 14 ++++++++++--- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp b/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp index 1eaa20836f7641..6553943395b6d5 100644 --- a/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp +++ b/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp @@ -48,7 +48,14 @@ void registerComponents( rncli_registerProviders(registry); } -std::shared_ptr provideModules( +std::shared_ptr cxxModuleProvider( + const std::string &name, + const std::shared_ptr &jsInvoker) { + // Not implemented yet: provide pure-C++ NativeModules here. + return nullptr; +} + +std::shared_ptr moduleProvider( const std::string &name, const JavaTurboModule::InitParams ¶ms) { // Here you can provide your own module provider for TurboModules coming from @@ -70,8 +77,10 @@ std::shared_ptr provideModules( JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { return facebook::jni::initialize(vm, [] { - facebook::react::DefaultTurboModuleManagerDelegate:: - moduleProvidersFromEntryPoint = &facebook::react::provideModules; + facebook::react::DefaultTurboModuleManagerDelegate::cxxModuleProvider = + &facebook::react::cxxModuleProvider; + facebook::react::DefaultTurboModuleManagerDelegate::moduleProvider = + &facebook::react::moduleProvider; facebook::react::DefaultComponentsRegistry:: registerComponentDescriptorsFromEntryPoint = &facebook::react::registerComponents; diff --git a/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp b/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp index 09534d8ce08aca..9e9cb9c33655fb 100644 --- a/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp +++ b/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.cpp @@ -12,10 +12,15 @@ namespace facebook { namespace react { +std::function( + const std::string &, + const std::shared_ptr &)> + DefaultTurboModuleManagerDelegate::cxxModuleProvider{nullptr}; + std::function( const std::string &, const JavaTurboModule::InitParams &)> - DefaultTurboModuleManagerDelegate::moduleProvidersFromEntryPoint{nullptr}; + DefaultTurboModuleManagerDelegate::moduleProvider{nullptr}; jni::local_ref DefaultTurboModuleManagerDelegate::initHybrid(jni::alias_ref) { @@ -32,17 +37,21 @@ void DefaultTurboModuleManagerDelegate::registerNatives() { std::shared_ptr DefaultTurboModuleManagerDelegate::getTurboModule( const std::string &name, const std::shared_ptr &jsInvoker) { - // Not implemented yet: provide pure-C++ NativeModules here. + auto moduleProvider = DefaultTurboModuleManagerDelegate::cxxModuleProvider; + if (moduleProvider) { + return moduleProvider(name, jsInvoker); + } return nullptr; } std::shared_ptr DefaultTurboModuleManagerDelegate::getTurboModule( const std::string &name, const JavaTurboModule::InitParams ¶ms) { - auto resolvedModule = (DefaultTurboModuleManagerDelegate:: - moduleProvidersFromEntryPoint)(name, params); - if (resolvedModule != nullptr) { - return resolvedModule; + auto moduleProvider = DefaultTurboModuleManagerDelegate::moduleProvider; + if (moduleProvider) { + if (auto resolvedModule = moduleProvider(name, params)) { + return resolvedModule; + } } return rncore_ModuleProvider(name, params); } diff --git a/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h b/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h index 1a9c75b1d9c1cc..e909fd69d91cbe 100644 --- a/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h +++ b/ReactAndroid/src/main/jni/react/newarchdefaults/DefaultTurboModuleManagerDelegate.h @@ -27,10 +27,15 @@ class DefaultTurboModuleManagerDelegate : public jni::HybridClass< static void registerNatives(); + static std::function( + const std::string &, + const std::shared_ptr &)> + cxxModuleProvider; + static std::function( const std::string &, const JavaTurboModule::InitParams &)> - moduleProvidersFromEntryPoint; + moduleProvider; std::shared_ptr getTurboModule( const std::string &name, diff --git a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp index ae21e72a4dccff..7c36c4173b5b60 100644 --- a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp +++ b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp @@ -23,7 +23,13 @@ void registerComponents( RNTMyNativeViewComponentDescriptor>()); } -std::shared_ptr provideModules( +std::shared_ptr cxxModuleProvider( + const std::string &name, + const std::shared_ptr &jsInvoker) { + return nullptr; +} + +std::shared_ptr moduleProvider( const std::string &name, const JavaTurboModule::InitParams ¶ms) { auto module = AppSpecs_ModuleProvider(name, params); @@ -42,8 +48,10 @@ std::shared_ptr provideModules( JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { return facebook::jni::initialize(vm, [] { - facebook::react::DefaultTurboModuleManagerDelegate:: - moduleProvidersFromEntryPoint = &facebook::react::provideModules; + facebook::react::DefaultTurboModuleManagerDelegate::cxxModuleProvider = + &facebook::react::cxxModuleProvider; + facebook::react::DefaultTurboModuleManagerDelegate::moduleProvider = + &facebook::react::moduleProvider; facebook::react::DefaultComponentsRegistry:: registerComponentDescriptorsFromEntryPoint = &facebook::react::registerComponents;