Skip to content

Commit 5e7d88f

Browse files
committed
[Fabric] Add a MainComponentsRegistry for the application
1 parent 8afa19e commit 5e7d88f

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.rnnewarchitectureapp.components;
2+
3+
import com.facebook.common.internal.DoNotStrip;
4+
import com.facebook.jni.HybridData;
5+
import com.facebook.react.fabric.ComponentFactory;
6+
import com.facebook.soloader.SoLoader;
7+
8+
@DoNotStrip
9+
public class MainComponentsRegistry {
10+
static {
11+
SoLoader.loadLibrary("fabricjni");
12+
}
13+
14+
@DoNotStrip private final HybridData mHybridData;
15+
16+
@DoNotStrip
17+
private native HybridData initHybrid(ComponentFactory componentFactory);
18+
19+
@DoNotStrip
20+
private MainComponentsRegistry(ComponentFactory componentFactory) {
21+
mHybridData = initHybrid(componentFactory);
22+
}
23+
24+
@DoNotStrip
25+
public static MainComponentsRegistry register(ComponentFactory componentFactory) {
26+
return new MainComponentsRegistry(componentFactory);
27+
}
28+
}

Diff for: android/app/src/main/jni/MainComponentsRegistry.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "MainComponentsRegistry.h"
2+
3+
#include <CoreComponentsRegistry.h>
4+
#include <fbjni/fbjni.h>
5+
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
6+
#include <react/renderer/components/answersolver/ComponentDescriptors.h>
7+
#include <react/renderer/components/rncore/ComponentDescriptors.h>
8+
9+
namespace facebook {
10+
namespace react {
11+
12+
MainComponentsRegistry::MainComponentsRegistry(
13+
ComponentFactory *delegate)
14+
: delegate_(delegate) {}
15+
16+
std::shared_ptr<ComponentDescriptorProviderRegistry const>
17+
MainComponentsRegistry::sharedProviderRegistry() {
18+
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
19+
20+
providerRegistry->add(concreteComponentDescriptorProvider<
21+
AnswerViewerComponentDescriptor>());
22+
23+
return providerRegistry;
24+
}
25+
26+
jni::local_ref<MainComponentsRegistry::jhybriddata>
27+
MainComponentsRegistry::initHybrid(
28+
jni::alias_ref<jclass>,
29+
ComponentFactory *delegate) {
30+
auto instance = makeCxxInstance(delegate);
31+
32+
auto buildRegistryFunction =
33+
[](EventDispatcher::Weak const &eventDispatcher,
34+
ContextContainer::Shared const &contextContainer)
35+
-> ComponentDescriptorRegistry::Shared {
36+
auto registry = MainComponentsRegistry::sharedProviderRegistry()
37+
->createComponentDescriptorRegistry(
38+
{eventDispatcher, contextContainer});
39+
40+
auto mutableRegistry =
41+
std::const_pointer_cast<ComponentDescriptorRegistry>(registry);
42+
43+
mutableRegistry->setFallbackComponentDescriptor(
44+
std::make_shared<UnimplementedNativeViewComponentDescriptor>(
45+
ComponentDescriptorParameters{
46+
eventDispatcher, contextContainer, nullptr}));
47+
48+
return registry;
49+
};
50+
51+
delegate->buildRegistryFunction = buildRegistryFunction;
52+
return instance;
53+
}
54+
55+
void MainComponentsRegistry::registerNatives() {
56+
registerHybrid({
57+
makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
58+
});
59+
}
60+
61+
} // namespace react
62+
} // namespace facebook

Diff for: android/app/src/main/jni/MainComponentsRegistry.h

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#pragma once
2+
3+
#include <ComponentFactory.h>
4+
#include <fbjni/fbjni.h>
5+
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
6+
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
7+
8+
namespace facebook {
9+
namespace react {
10+
11+
class MainComponentsRegistry
12+
: public facebook::jni::HybridClass<MainComponentsRegistry> {
13+
public:
14+
constexpr static auto kJavaDescriptor =
15+
"Lcom/rnnewarchitectureapp/components/MainComponentsRegistry;";
16+
17+
static void registerNatives();
18+
19+
MainComponentsRegistry(ComponentFactory *delegate);
20+
21+
private:
22+
friend HybridBase;
23+
24+
static std::shared_ptr<ComponentDescriptorProviderRegistry const>
25+
sharedProviderRegistry();
26+
27+
const ComponentFactory *delegate_;
28+
29+
static jni::local_ref<jhybriddata> initHybrid(
30+
jni::alias_ref<jclass>,
31+
ComponentFactory *delegate);
32+
};
33+
34+
} // namespace react
35+
} // namespace facebook

Diff for: android/app/src/main/jni/OnLoad.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#include <fbjni/fbjni.h>
22
#include "MainApplicationTurboModuleManagerDelegate.h"
3+
#include "MainComponentsRegistry.h"
34

45
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
56
return facebook::jni::initialize(vm, [] {
67
facebook::react::MainApplicationTurboModuleManagerDelegate::registerNatives();
8+
facebook::react::MainComponentsRegistry::registerNatives();
79
});
810
}

0 commit comments

Comments
 (0)