From 7facb32f30d17eb27f870dd531d3dc7ebe4532f6 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 5 Apr 2024 20:12:17 -0700 Subject: [PATCH] Remove core modules from the default tmmdelegate (#43939) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/43939 ## Problem If we link the default tmmdelegate with our vr apps, we get this issue: ``` ld.lld: error: duplicate symbol: facebook::react::NativeDevLoadingViewSpecJSI::NativeDevLoadingViewSpecJSI(facebook::react::JavaTurboModule::InitParams const&) >>> defined at firsttimenux_v2AppModulesCodegen-generated.cpp:1367 (buck-out/v2/gen/fbsource/bcbe7a50bd5ff29a/arvr/libraries/react-panellib/FirstTimeNux/__firsttimenux_v2AppModulesCodegen-codegen-modules-jni_cpp__/out/firsttimenux_v2AppModulesCodegen-generated.cpp:1367) >>> firsttimenux_v2AppModulesCodegen-generated.cpp.pic.o:(facebook::react::NativeDevLoadingViewSpecJSI::NativeDevLoadingViewSpecJSI(facebook::react::JavaTurboModule::InitParams const&)) in archive buck-out/v2/gen/fbsource/bcbe7a50bd5ff29a/arvr/libraries/react-panellib/FirstTimeNux/__firsttimenux_v2AppModulesCodegen-jni__/libfirsttimenux_v2AppModulesCodegen-jni.pic.a >>> defined at rncore-generated.cpp:606 (buck-out/v2/gen/fbsource/bcbe7a50bd5ff29a/xplat/js/react-native-github/__rncore-codegen-modules-jni_cpp__/out/rncore-generated.cpp:606) >>> rncore-generated.cpp.pic.o:(.text._ZN8facebook5react27NativeDevLoadingViewSpecJSIC2ERKNS0_15JavaTurboModule10InitParamsE+0x0) in archive buck-out/v2/gen/fbsource/bcbe7a50bd5ff29a/xplat/js/react-native-github/__rncore-jniAndroid__/librncore-jniAndroid.pic.a ``` ## Cause My best understanding of the problem: - Default tmmdelegate links against rncore, which contains codegen for react native's standard library of modules. - But, the default delegate also pulls in this appmodules.so library. That library also contains codegen for react native's standard library of modules + the app's modules. So, two so libraries define the same symbols. Hence the build fails. ## Solution Remove the codegen for react native's standard library of modules from the default tmmdelegate. Prereq: In open source, also make appmodules.so include the codegen for react native's standard library of modules. Changelog: [Android][Breaking] - Make the app responsible for returning core turbomodule jsi hostobjects Reviewed By: cortinico Differential Revision: D55613024 fbshipit-source-id: 6406a9f388ff9de01288de0e263a78a079e7a0da --- .../cmake-utils/default-app-setup/OnLoad.cpp | 12 +++++++++++- .../DefaultTurboModuleManagerDelegate.cpp | 4 ++-- .../rn-tester/android/app/src/main/jni/OnLoad.cpp | 7 +++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/react-native/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp b/packages/react-native/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp index 56a38374370..e6659fe53a8 100644 --- a/packages/react-native/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp +++ b/packages/react-native/ReactAndroid/cmake-utils/default-app-setup/OnLoad.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef REACT_NATIVE_APP_CODEGEN_HEADER #include REACT_NATIVE_APP_CODEGEN_HEADER @@ -95,8 +96,17 @@ std::shared_ptr javaModuleProvider( } #endif + // We first try to look up core modules + if (auto module = rncore_ModuleProvider(name, params)) { + return module; + } + // And we fallback to the module providers autolinked by RN CLI - return rncli_ModuleProvider(name, params); + if (auto module = rncli_ModuleProvider(name, params)) { + return module; + } + + return nullptr; } } // namespace facebook::react 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 f7547b1f801..34a98d5483b 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 @@ -12,7 +12,6 @@ #include #include #include -#include namespace facebook::react { @@ -100,7 +99,8 @@ std::shared_ptr DefaultTurboModuleManagerDelegate::getTurboModule( return resolvedModule; } } - return rncore_ModuleProvider(name, params); + + return nullptr; } } // namespace facebook::react 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 7ba52751e28..927ab744ca7 100644 --- a/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp +++ b/packages/rn-tester/android/app/src/main/jni/OnLoad.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef REACT_NATIVE_APP_CODEGEN_HEADER #include REACT_NATIVE_APP_CODEGEN_HEADER @@ -51,6 +52,12 @@ std::shared_ptr javaModuleProvider( return module; } #endif + + // We first try to look up core modules + if (auto module = rncore_ModuleProvider(name, params)) { + return module; + } + return nullptr; }