From 244c9ff549d1c7cd1e7f49c2327d54c36dc630fd Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Thu, 20 Apr 2023 04:39:08 -0700 Subject: [PATCH] Move QPL bindings to internal Summary: Changelog: [Android][Changed] - Move QPL bindings to internal Reviewed By: RSNara Differential Revision: D45046703 fbshipit-source-id: 6383c718bf75dd6436136cdc881c9f59f18a452f --- .../react/bridgeless/BindingsInstaller.java | 26 +++++++++++++++ .../react/bridgeless/ReactInstance.java | 3 ++ .../bridgeless/ReactInstanceDelegate.java | 2 ++ .../bridgeless/bindings/BindingsInstaller.h | 26 --------------- .../react/bridgeless/jni/JBindingsInstaller.h | 32 +++++++++++++++++++ .../react/bridgeless/jni/JReactInstance.cpp | 31 ++++++++++-------- .../jni/react/bridgeless/jni/JReactInstance.h | 4 +++ .../react/bridgeless/BindingsInstaller.h | 22 +++++++++++++ 8 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BindingsInstaller.java delete mode 100644 packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/bindings/BindingsInstaller.h create mode 100644 packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h create mode 100644 packages/react-native/ReactCommon/react/bridgeless/BindingsInstaller.h diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BindingsInstaller.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BindingsInstaller.java new file mode 100644 index 00000000000..53d1c59e84d --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/BindingsInstaller.java @@ -0,0 +1,26 @@ +/* + * 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. + */ + +package com.facebook.react.bridgeless; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.proguard.annotations.DoNotStripAny; +import com.facebook.soloader.SoLoader; + +@DoNotStripAny +public abstract class BindingsInstaller { + static { + SoLoader.loadLibrary("rninstance"); + } + + @DoNotStrip private final HybridData mHybridData; + + protected BindingsInstaller(HybridData hybridData) { + mHybridData = hybridData; + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java index 72afdba4470..944512441fe 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstance.java @@ -149,6 +149,7 @@ public final class ReactInstance { }); JSEngineInstance jsEngineInstance = mDelegate.getJSEngineInstance(mBridgelessReactContext); + BindingsInstaller bindingsInstaller = mDelegate.getBindingsInstaller(); // Notify JS if profiling is enabled boolean isProfiling = Systrace.isTracing(Systrace.TRACE_TAG_REACT_APPS | Systrace.TRACE_TAG_REACT_JS_VM_CALLS); @@ -160,6 +161,7 @@ public final class ReactInstance { mJavaTimerManager, jsTimerExecutor, reactExceptionManager, + bindingsInstaller, isProfiling); RuntimeExecutor unbufferedRuntimeExecutor = getUnbufferedRuntimeExecutor(); @@ -386,6 +388,7 @@ public final class ReactInstance { JavaTimerManager timerManager, JSTimerExecutor jsTimerExecutor, ReactJsExceptionHandler jReactExceptionsManager, + BindingsInstaller jBindingsInstaller, boolean isProfiling); @DoNotStrip diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstanceDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstanceDelegate.java index 872ba9629c8..1c9a9e15134 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstanceDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridgeless/ReactInstanceDelegate.java @@ -24,6 +24,8 @@ public interface ReactInstanceDelegate { JSBundleLoader getJSBundleLoader(Context context); + BindingsInstaller getBindingsInstaller(); + TurboModuleManagerDelegate getTurboModuleManagerDelegate(ReactApplicationContext context); List getViewManagers(ReactApplicationContext context); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/bindings/BindingsInstaller.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/bindings/BindingsInstaller.h deleted file mode 100644 index df87b259a49..00000000000 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/bindings/BindingsInstaller.h +++ /dev/null @@ -1,26 +0,0 @@ -// (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. - -#pragma once - -#include -#include - -#include -#include - -namespace facebook { -namespace react { - -class BindingsInstaller { - public: - ReactInstance::BindingsInstallFunc getBindingsInstallFunc() { - auto installBindings = [](jsi::Runtime &runtime) { - jsi::installQPLBindings(runtime); - jsi::installUserFlowBindings(runtime); - }; - return installBindings; - } -}; - -} // namespace react -} // namespace facebook diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h new file mode 100644 index 00000000000..cc632469ba7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JBindingsInstaller.h @@ -0,0 +1,32 @@ +/* + * 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 +#include +#include +#include + +namespace facebook { +namespace react { + +class JBindingsInstaller : public jni::HybridClass, + public BindingsInstaller { + public: + static constexpr auto kJavaDescriptor = + "Lcom/facebook/react/bridgeless/BindingsInstaller;"; + + ~JBindingsInstaller() {} + + private: + friend HybridBase; +}; + +} // namespace react +} // namespace facebook diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp index 475fec6d06a..2d1837ac9df 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.cpp @@ -11,7 +11,6 @@ #include #endif -#include #include #include #include @@ -37,6 +36,7 @@ JReactInstance::JReactInstance( jni::alias_ref javaTimerManager, jni::alias_ref jsTimerExecutor, jni::alias_ref jReactExceptionManager, + jni::alias_ref jBindingsInstaller, bool isProfiling) noexcept { // TODO(janzer): Lazily create runtime auto sharedJSMessageQueueThread = @@ -50,10 +50,6 @@ JReactInstance::JReactInstance( auto timerManager = std::make_shared(std::move(timerRegistry)); jsTimerExecutor->cthis()->setTimerManager(timerManager); - // Create the instance - std::unique_ptr bindingsInstaller = - std::make_unique(); - jReactExceptionManager_ = jni::make_global(jReactExceptionManager); auto jsErrorHandlingFunc = [this](MapBuffer errorMap) noexcept { if (jReactExceptionManager_ != nullptr) { @@ -63,26 +59,31 @@ JReactInstance::JReactInstance( } }; + jBindingsInstaller_ = jni::make_global(jBindingsInstaller); + instance_ = std::make_unique( jsEngineInstance->cthis()->createJSRuntime(), sharedJSMessageQueueThread, timerManager, std::move(jsErrorHandlingFunc)); - auto appBindingInstaller = bindingsInstaller->getBindingsInstallFunc(); auto bufferedRuntimeExecutor = instance_->getBufferedRuntimeExecutor(); timerManager->setRuntimeExecutor(bufferedRuntimeExecutor); ReactInstance::JSRuntimeFlags options = {.isProfiling = isProfiling}; - instance_->initializeRuntime( - options, - [appBindingInstaller, instance = instance_.get()](jsi::Runtime &runtime) { - react::Logger androidLogger = - static_cast( - &reactAndroidLoggingHook); - react::bindNativeLogger(runtime, androidLogger); + instance_->initializeRuntime(options, [this](jsi::Runtime &runtime) { + react::Logger androidLogger = + static_cast( + &reactAndroidLoggingHook); + react::bindNativeLogger(runtime, androidLogger); + if (jBindingsInstaller_ != nullptr) { + auto appBindingInstaller = + jBindingsInstaller_->cthis()->getBindingsInstallFunc(); + if (appBindingInstaller != nullptr) { appBindingInstaller(runtime); - }); + } + } + }); auto unbufferedRuntimeExecutor = instance_->getUnbufferedRuntimeExecutor(); // Set up the JS and native modules call invokers (for TurboModules) @@ -112,6 +113,7 @@ jni::local_ref JReactInstance::initHybrid( jni::alias_ref javaTimerManager, jni::alias_ref jsTimerExecutor, jni::alias_ref jReactExceptionManager, + jni::alias_ref jBindingsInstaller, bool isProfiling) { return makeCxxInstance( jsEngineInstance, @@ -120,6 +122,7 @@ jni::local_ref JReactInstance::initHybrid( javaTimerManager, jsTimerExecutor, jReactExceptionManager, + jBindingsInstaller, isProfiling); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h index 3ab71e7b2fa..6604af59955 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/bridgeless/jni/JReactInstance.h @@ -21,6 +21,7 @@ #include #include +#include "JBindingsInstaller.h" #include "JJSEngineInstance.h" #include "JJSTimerExecutor.h" #include "JJavaTimerManager.h" @@ -43,6 +44,7 @@ class JReactInstance : public jni::HybridClass { jni::alias_ref javaTimerManager, jni::alias_ref jsTimerExecutor, jni::alias_ref jReactExceptionManager, + jni::alias_ref jBindingsInstaller, bool isProfiling); /* @@ -87,6 +89,7 @@ class JReactInstance : public jni::HybridClass { jni::alias_ref javaTimerManager, jni::alias_ref jsTimerExecutor, jni::alias_ref jReactExceptionManager, + jni::alias_ref jBindingsInstaller, bool isProfiling) noexcept; jni::alias_ref getJSCallInvokerHolder(); @@ -99,6 +102,7 @@ class JReactInstance : public jni::HybridClass { jni::global_ref jsCallInvokerHolder_; jni::global_ref nativeCallInvokerHolder_; jni::global_ref jReactExceptionManager_; + jni::global_ref jBindingsInstaller_; }; } // namespace react diff --git a/packages/react-native/ReactCommon/react/bridgeless/BindingsInstaller.h b/packages/react-native/ReactCommon/react/bridgeless/BindingsInstaller.h new file mode 100644 index 00000000000..3d02fd90c3a --- /dev/null +++ b/packages/react-native/ReactCommon/react/bridgeless/BindingsInstaller.h @@ -0,0 +1,22 @@ +/* + * 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 + +namespace facebook { +namespace react { + +class BindingsInstaller { + public: + virtual ReactInstance::BindingsInstallFunc getBindingsInstallFunc() { + return nullptr; + } +}; +} // namespace react +} // namespace facebook