From c2912655083da8983aa7a29616f248a87fa1c34d Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 17 Aug 2020 14:17:00 -0700 Subject: [PATCH] Reintroduce CoreComponentsRegistry class Summary: This diff reintroduces the CoreComponentsRegistry class to register core components in the RN Tester app. This class was previously deleted as part of D23091020 (https://github.com/facebook/react-native/commit/7fb1afae7f4b78970463e272b7d4f3230e84887d). Different from a past approach, this diff doesn't use inheritance for Hybrid classes (which seems to bring problems in Android 4 devices) I'm planning to land this diff after I verify that D23091020 (https://github.com/facebook/react-native/commit/7fb1afae7f4b78970463e272b7d4f3230e84887d) fixed RC (maybe I will wait until sunday's cut) changelog: [internal] internal Reviewed By: fkgozali Differential Revision: D23109856 fbshipit-source-id: 5220e522e197f701c782ab5089f9f1036ec90c19 --- .../react/uiapp/RNTesterApplication.java | 4 +- .../react/fabric/CoreComponentsRegistry.java | 34 ++++++++++ .../fabric/jni/CoreComponentsRegistry.cpp | 65 +++++++++++++++++++ .../react/fabric/jni/CoreComponentsRegistry.h | 42 ++++++++++++ .../com/facebook/react/fabric/jni/OnLoad.cpp | 2 + 5 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp create mode 100644 ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h diff --git a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java index 2e3b26667bc..7ed10e4abb1 100644 --- a/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ b/RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java @@ -25,6 +25,7 @@ import com.facebook.react.bridge.JavaScriptContextHolder; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.UIManager; import com.facebook.react.fabric.ComponentFactory; +import com.facebook.react.fabric.CoreComponentsRegistry; import com.facebook.react.fabric.FabricJSIModuleProvider; import com.facebook.react.fabric.ReactNativeConfig; import com.facebook.react.shell.MainReactPackage; @@ -84,8 +85,7 @@ public class RNTesterApplication extends Application implements ReactApplication @Override public JSIModuleProvider getJSIModuleProvider() { ComponentFactory ComponentFactory = new ComponentFactory(); - // TODO: T71642450 Register CoreComponentsRegistry again - // CoreComponentsRegistry.register(ComponentFactory); + CoreComponentsRegistry.register(ComponentFactory); return new FabricJSIModuleProvider( reactApplicationContext, ComponentFactory, diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java new file mode 100644 index 00000000000..6c6e9c04ce6 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) Facebook, Inc. and its 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.fabric; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; + +@DoNotStrip +public class CoreComponentsRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + @DoNotStrip private final HybridData mHybridData; + + @DoNotStrip + private native HybridData initHybrid(ComponentFactory componentFactory); + + @DoNotStrip + private CoreComponentsRegistry(ComponentFactory componentFactory) { + mHybridData = initHybrid(componentFactory); + } + + @DoNotStrip + public static CoreComponentsRegistry register(ComponentFactory componentFactory) { + return new CoreComponentsRegistry(componentFactory); + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp new file mode 100644 index 00000000000..962facf0eb4 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "CoreComponentsRegistry.h" + +#include + +#include + +#include +#include + +namespace facebook { +namespace react { + +CoreComponentsRegistry::CoreComponentsRegistry(ComponentFactory *delegate) + : delegate_(delegate) {} + +std::shared_ptr +CoreComponentsRegistry::sharedProviderRegistry() { + static auto providerRegistry = + []() -> std::shared_ptr { + auto providerRegistry = + std::make_shared(); + + providerRegistry->add( + concreteComponentDescriptorProvider()); + return providerRegistry; + }(); + + return providerRegistry; +} + +jni::local_ref +CoreComponentsRegistry::initHybrid( + jni::alias_ref, + ComponentFactory *delegate) { + auto instance = makeCxxInstance(delegate); + + auto buildRegistryFunction = + [](EventDispatcher::Weak const &eventDispatcher, + ContextContainer::Shared const &contextContainer) + -> ComponentDescriptorRegistry::Shared { + auto registry = CoreComponentsRegistry::sharedProviderRegistry() + ->createComponentDescriptorRegistry( + {eventDispatcher, contextContainer}); + return registry; + }; + + delegate->buildRegistryFunction = buildRegistryFunction; + return instance; +} + +void CoreComponentsRegistry::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", CoreComponentsRegistry::initHybrid), + }); +} + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h new file mode 100644 index 00000000000..255a51a12f9 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) Facebook, Inc. and its 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 "ComponentFactory.h" + +namespace facebook { +namespace react { + +class CoreComponentsRegistry + : public facebook::jni::HybridClass { + public: + constexpr static auto kJavaDescriptor = + "Lcom/facebook/react/fabric/CoreComponentsRegistry;"; + + static void registerNatives(); + + CoreComponentsRegistry(ComponentFactory *delegate); + + private: + friend HybridBase; + + static std::shared_ptr + sharedProviderRegistry(); + + const ComponentFactory *delegate_; + + static jni::local_ref initHybrid( + jni::alias_ref, + ComponentFactory *delegate); +}; + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp index 7d6008ccd04..03005372a65 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp @@ -9,6 +9,7 @@ #include "Binding.h" #include "ComponentFactory.h" +#include "CoreComponentsRegistry.h" #include "EventBeatManager.h" #include "EventEmitterWrapper.h" #include "StateWrapperImpl.h" @@ -20,5 +21,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { facebook::react::EventEmitterWrapper::registerNatives(); facebook::react::StateWrapperImpl::registerNatives(); facebook::react::ComponentFactory::registerNatives(); + facebook::react::CoreComponentsRegistry::registerNatives(); }); }