diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt index 9434b5a3c52..d24a9ee9902 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/utils/NdkConfiguratorUtils.kt @@ -102,6 +102,7 @@ internal object NdkConfiguratorUtils { "**/libreact_debug.so", "**/libreact_nativemodule_core.so", "**/libreact_newarchdefaults.so", + "**/libreact_cxxreactpackage.so", "**/libreact_render_componentregistry.so", "**/libreact_render_core.so", "**/libreact_render_debug.so", diff --git a/packages/react-native/ReactAndroid/build.gradle b/packages/react-native/ReactAndroid/build.gradle index ebf4cf3c26d..3dbd23de72c 100644 --- a/packages/react-native/ReactAndroid/build.gradle +++ b/packages/react-native/ReactAndroid/build.gradle @@ -105,6 +105,10 @@ final def preparePrefab = tasks.register("preparePrefab", PreparePrefabHeadersTa "react_newarchdefaults", new Pair("src/main/jni/react/newarchdefaults", "") ), + new PrefabPreprocessingEntry( + "react_cxxreactpackage", + new Pair("src/main/jni/react/runtime/cxxreactpackage", "") + ), new PrefabPreprocessingEntry( "react_render_animations", new Pair("../ReactCommon/react/renderer/animations/", "react/renderer/animations/") @@ -530,6 +534,7 @@ android { "react_utils", "react_render_componentregistry", "react_newarchdefaults", + "react_cxxreactpackage", "react_render_animations", "react_render_core", "react_render_graphics", @@ -650,6 +655,9 @@ android { react_newarchdefaults { headers(new File(prefabHeadersDir, "react_newarchdefaults").absolutePath) } + react_cxxreactpackage { + headers(new File(prefabHeadersDir, "react_cxxreactpackage").absolutePath) + } react_render_animations { headers(new File(prefabHeadersDir, "react_render_animations").absolutePath) } diff --git a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake index d49fa9ed80d..964e76f3753 100644 --- a/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake +++ b/packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake @@ -71,6 +71,7 @@ add_library(react_debug ALIAS ReactAndroid::react_debug) add_library(react_utils ALIAS ReactAndroid::react_utils) add_library(react_render_componentregistry ALIAS ReactAndroid::react_render_componentregistry) add_library(react_newarchdefaults ALIAS ReactAndroid::react_newarchdefaults) +add_library(react_cxxreactpackage ALIAS ReactAndroid::react_cxxreactpackage) add_library(react_render_core ALIAS ReactAndroid::react_render_core) add_library(react_render_graphics ALIAS ReactAndroid::react_render_graphics) add_library(rrc_view ALIAS ReactAndroid::rrc_view) @@ -99,6 +100,7 @@ target_link_libraries(${CMAKE_PROJECT_NAME} react_utils # prefab ready react_nativemodule_core # prefab ready react_newarchdefaults # prefab ready + react_cxxreactpackage # prefab ready react_render_componentregistry # prefab ready react_render_core # prefab ready react_render_debug # prefab ready diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/cxxreactpackage/CxxReactPackage.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/cxxreactpackage/CxxReactPackage.kt new file mode 100644 index 00000000000..278d3d723c3 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/cxxreactpackage/CxxReactPackage.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// TODO(170197717): Consider moving this to runtime.cxx, or just runtime +package com.facebook.react.runtime.cxxreactpackage + +import com.facebook.jni.HybridData +import com.facebook.proguard.annotations.DoNotStrip +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.soloader.SoLoader + +/** CxxReactPackage is used to register C++ Turbo Modules with React Native. */ +@UnstableReactNativeAPI() +abstract class CxxReactPackage { + + @DoNotStrip @SuppressWarnings("unused") private val hybridData: HybridData + + protected abstract fun initHybrid(): HybridData + + protected constructor() { + maybeLoadOtherSoLibraries() + hybridData = initHybrid() + } + + @Synchronized protected open fun maybeLoadOtherSoLibraries(): Unit {} + + companion object { + init { + SoLoader.loadLibrary("react_cxxreactpackage") + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt index e765f9b67f3..feb7a3b33ca 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt @@ -121,6 +121,7 @@ add_react_android_subdir(src/main/jni/react/fabric) add_react_android_subdir(src/main/jni/react/newarchdefaults) add_react_android_subdir(src/main/jni/react/hermes/reactexecutor) add_react_android_subdir(src/main/jni/react/hermes/instrumentation/) +add_react_android_subdir(src/main/jni/react/runtime/cxxreactpackage) add_react_android_subdir(src/main/jni/react/runtime/jni) add_react_android_subdir(src/main/jni/react/runtime/hermes/jni) add_react_android_subdir(src/main/jni/react/runtime/jsc/jni) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/CMakeList.txt b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/CMakeList.txt new file mode 100644 index 00000000000..3cea9584772 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/CMakeList.txt @@ -0,0 +1,29 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +add_compile_options( + -fexceptions + -frtti + -Wno-unused-lambda-capture + -std=c++20) + + +######################### +### cxxreactpackage ### +######################### + +add_library(react_cxxreactpackage SHARED ReactCommon/OnLoad.cpp) + +target_include_directories(react_cxxreactpackage + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_link_libraries(react_cxxreactpackage + fb + fbjni) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/CxxReactPackage.h b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/CxxReactPackage.h new file mode 100644 index 00000000000..cdf1a86a7f4 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/CxxReactPackage.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook::react { + +class TurboModule; +class CallInvoker; + +class CxxReactPackage : public jni::HybridClass { + public: + static auto constexpr kJavaDescriptor = + "Lcom/facebook/react/runtime/cxxreactpackage/CxxReactPackage;"; + + virtual std::shared_ptr getModule( + const std::string& name, + const std::shared_ptr& jsInvoker) = 0; + + private: + friend HybridBase; +}; + +} // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/OnLoad.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/OnLoad.cpp new file mode 100644 index 00000000000..e7f1f355b50 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/cxxreactpackage/ReactCommon/OnLoad.cpp @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include + +#include "CxxReactPackage.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) { + return facebook::jni::initialize(vm, [] {}); +}