mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-29 04:35:36 +08:00
Summary:
JSCallInvoker requires a `std::weak_ptr<Instance>` to create. In our C++, `CatalystInstance` is responsible for creating this `Instance` object. This `CatalystInstance` C++ initialization is separate from the `TurboModuleManager` C++ initialization. Therefore, in this diff, I made `CatalystInstance` responsible for creating the `JSCallInvoker`. It then exposes the `JSCallInvoker` using a hybrid class called `JSCallInvokerHolder`, which contains a `std::shared_ptr<JSCallInvoker>` member variable. Using `CatalystInstance.getJSCallInvokerHolder()` in TurboModuleManager.java, we get a handle to this hybrid container. Then, we pass it this hybrid object to `TurboModuleManager::initHybrid`, which retrieves the `std::shared_ptr<JSCallInvoker>` from the `JavaJSCallInvokerHandler`.
There were a few cyclic dependencies, so I had to break down the buck targets:
- `CatalystInstanceImpl.java` depends on `JSCallInvokerHolderImpl.java`, and `TurboModuleManager.java` depends on classes that are packaged with `CatalystInstanceImpl.java`. So, I had to put `JSCallInvokerHolderImpl.java` in its own buck target.
- `CatalystInstance.cpp` depends on `JavaJSCallInvokerHolder.cpp`, and `TurboModuleManager.cpp` depends on classes that are build with `CatalystInstance.cpp`. So, I had to put `JavaJSCallInvokerHolder.cpp` in its own buck target. To make things simpler, I also moved `JSCallInvoker.{cpp,h}` files into the same buck target as `JavaJSCallInvokerHolder.{cpp,h}`.
I think these steps should be enough to create the TurboModuleManager without needing a bridge:
1. Make `JSCallInvoker` an abstract base class.
2. On Android, create another derived class of `JSCallInvoker` that doesn't depend on Instance.
3. Create `JavaJSCallInvokerHolder` using an instance of this new class somewhere in C++.
4. Pass this instance of `JavaJSCallInvokerHolder` to Java and use it to create/instatiate `TurboModuleManager`.
Regarding steps 1 and 2, we can also make JSCallInvoker accept a lambda.
Reviewed By: mdvacca
Differential Revision: D15055511
fbshipit-source-id: 0ad72a86599819ec35d421dbee7e140959a26ab6
87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
load("@fbsource//tools/build_defs/apple:flag_defs.bzl", "OBJC_ARC_PREPROCESSOR_FLAGS", "get_debug_preprocessor_flags", "get_static_library_ios_flags")
|
|
load("//tools/build_defs/oss:rn_defs.bzl", "ANDROID", "APPLE", "react_native_target", "react_native_xplat_target", "rn_xplat_cxx_library", "subdir_glob")
|
|
|
|
rn_xplat_cxx_library(
|
|
name = "core",
|
|
srcs = glob(
|
|
["*.cpp"],
|
|
),
|
|
header_namespace = "",
|
|
exported_headers = subdir_glob(
|
|
[
|
|
("", "*.h"),
|
|
],
|
|
prefix = "jsireact",
|
|
),
|
|
compiler_flags = [
|
|
"-fexceptions",
|
|
"-frtti",
|
|
"-std=c++14",
|
|
"-Wall",
|
|
],
|
|
fbandroid_deps = [
|
|
react_native_target("jni/react/jni:jni"),
|
|
],
|
|
fbandroid_exported_headers = subdir_glob(
|
|
[
|
|
("platform/android", "*.h"),
|
|
],
|
|
prefix = "jsireact",
|
|
),
|
|
fbandroid_srcs = glob(
|
|
[
|
|
"platform/android/**/*.cpp",
|
|
],
|
|
),
|
|
fbobjc_compiler_flags = [
|
|
"-Wall",
|
|
"-fobjc-arc-exceptions",
|
|
],
|
|
fbobjc_inherited_buck_flags = get_static_library_ios_flags(),
|
|
fbobjc_preprocessor_flags = OBJC_ARC_PREPROCESSOR_FLAGS + get_debug_preprocessor_flags(),
|
|
force_static = True,
|
|
ios_deps = [
|
|
"fbsource//xplat/FBBaseLite:FBBaseLite",
|
|
"fbsource//xplat/js/react-native-github:RCTCxxBridge",
|
|
"fbsource//xplat/js/react-native-github:RCTCxxModule",
|
|
"fbsource//xplat/js/react-native-github:ReactInternal",
|
|
],
|
|
ios_exported_headers = subdir_glob(
|
|
[
|
|
("platform/ios", "*.h"),
|
|
],
|
|
prefix = "jsireact",
|
|
),
|
|
ios_frameworks = [
|
|
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
|
],
|
|
ios_srcs = glob(
|
|
[
|
|
"platform/ios/**/*.cpp",
|
|
"platform/ios/**/*.mm",
|
|
],
|
|
),
|
|
platforms = (ANDROID, APPLE),
|
|
preprocessor_flags = [
|
|
"-DLOG_TAG=\"ReactNative\"",
|
|
"-DWITH_FBSYSTRACE=1",
|
|
],
|
|
visibility = [
|
|
"PUBLIC",
|
|
],
|
|
deps = [
|
|
"fbsource//xplat/fbsystrace:fbsystrace",
|
|
"fbsource//xplat/folly:headers_only",
|
|
"fbsource//xplat/folly:memory",
|
|
"fbsource//xplat/folly:molly",
|
|
"fbsource//xplat/jsi:JSIDynamic",
|
|
"fbsource//xplat/third-party/glog:glog",
|
|
react_native_xplat_target("cxxreact:bridge"),
|
|
react_native_xplat_target("cxxreact:module"),
|
|
react_native_xplat_target("jscallinvoker:jscallinvoker"),
|
|
],
|
|
exported_deps = [
|
|
"fbsource//xplat/jsi:jsi",
|
|
],
|
|
)
|