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..288ded2d568 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/CoreComponentsRegistry.java @@ -0,0 +1,26 @@ +/* + * 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.proguard.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; + +@DoNotStrip +public class CoreComponentsRegistry extends ComponentRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + private CoreComponentsRegistry(ComponentFactory componentFactory) { + super(componentFactory); + } + + 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(); }); }