C++ Turbo 原生模块
这个文档仍然是实验性的,随着我们的迭代,细节会有变化。欢迎在工作小组内的讨论中分享你的反馈。
此外,它还包含几个手动步骤。请注意新架构尚未稳定下来,最终的开发者体验会继续迭代改善。我们正在努力开发工具、模板和库,以帮助你在新架构上快速入门,而不需要经历整个设置过程。
本指南将向您展示如何仅使用 C++ 实现 Turbo 原生模块,以便与任何支持的平台(Android、iOS、macOS 或 Windows)共享相同的实现。
在继续本指南之前,请阅读Turbo Native Modules部分。作为进一步参考,我们为 RNTester 应用准备了一个示例(NativeCxxModuleExample) ,并在我们的社区代码库中提供了另一个示例(run/pure-cxx-module)。
使用 C++ Turbo 原生模块需要启用新架构。 要迁移到新架构,请按照迁移指南进行操作。
如何创建 C++ Turbo 原生模块
要创建 C++ Turbo 原生模块,您需要:
- 定义 JavaScript 规范。
- 配置 Codegen 以生成脚手架。
- 注册本地模块。
- 编写原生代码来完成模块的实现。
为新架构设置一个测试应用
第一步,创建一个新的应用程序:
npx react-native init CxxTurboModulesGuide
cd CxxTurboModulesGuide
yarn install
在 Android 上通过修改 android/gradle.properties
文件来启用新架构:
- newArchEnabled=false
+ newArchEnabled=true
在 iOS 上,在 ios
文件夹中运行 pod install
时启用新架构:
RCT_NEW_ARCH_ENABLED=1 bundle exec pod install
Turbo 模块文件夹设置
在项目中创建一个tm
文件夹。它将包含您的应用程序的所有 C++ Turbo 模块。最终结果应该如下所示:
CxxTurboModulesGuide
├── android
├── ios
├── js
└── tm
1. JavaScript 规范
在 tm
文件夹中创建以下规范:
- typescript
- flow
import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
// import type {TurboModule} from 'react-native'; in future versions
import {TurboModuleRegistry} from 'react-native';
export interface Spec extends TurboModule {
readonly reverseString: (input: string) => string;
}
export default TurboModuleRegistry.getEnforcing<Spec>(
'NativeSampleModule',
);
// @flow
import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport';
// import type {TurboModule} from 'react-native'; in future versions
import {TurboModuleRegistry} from 'react-native';
export interface Spec extends TurboModule {
+reverseString: (input: string) => string;
}
export default (TurboModuleRegistry.getEnforcing<Spec>(
'NativeSampleModule',
): Spec);
2. Codegen 配置
接下来,您需要为 Codegen 添加一些配置。
应用
请在您的应用的 package.json
文件中更新以下条目:
{
// ...
"description": "React Native with Cxx Turbo Native Modules",
"author": "<Your Name> <your_email@your_provider.com> (https://github.com/<your_github_handle>)",
"license": "MIT",
"homepage": "https://github.com/<your_github_handle>/#readme",
// ...
"codegenConfig": {
"name": "AppSpecs",
"type": "all",
"jsSrcsDir": "tm",
"android": {
"javaPackageName": "com.facebook.fbreact.specs"
}
}
}
它添加了必要的属性,我们将在 iOS 的 podspec
文件中重新使用,并配置 Codegen 在 tm
文件夹内搜索规范。
C++ Turbo 原生模块不会自动链接,需要按照下面描述的步骤手动包含到应用程序中。
iOS: 创建 podspec
文件
在 iOS 上,您需要在tm
文件夹中创建一个名为AppTurboModules.podspec
的文件 - 它将如下所示:
require "json"
package = JSON.parse(File.read(File.join(__dir__, "../package.json")))
Pod::Spec.new do |s|
s.name = "AppTurboModules"
s.version = package["version"]
s.summary = package["description"]
s.description = package["description"]
s.homepage = package["homepage"]
s.license = package["license"]
s.platforms = { :ios => "12.4" }
s.author = package["author"]
s.source = { :git => package["repository"], :tag => "#{s.version}" }
s.source_files = "**/*.{h,cpp}"
s.pod_target_xcconfig = {
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
}
install_modules_dependencies(s)
end
你需要将它作为依赖项添加到你的应用程序中的 ios/Podfile
文件中,例如,在 use_react_native!(...)
部分之后:
if ENV['RCT_NEW_ARCH_ENABLED'] == '1'
pod 'AppTurboModules', :path => "./../tm"
end
Android: build.gradle
, CMakeLists.txt
, Onload.cpp
对于 Android,您需要在tm
文件夹中创建一个名为CMakeLists.txt
的文件 - 其内容如下:
cmake_minimum_required(VERSION 3.13)
set(CMAKE_VERBOSE_MAKEFILE on)
add_compile_options(
-fexceptions
-frtti
-std=c++17)
file(GLOB tm_SRC CONFIGURE_DEPENDS *.cpp)
add_library(tm STATIC ${tm_SRC})
target_include_directories(tm PUBLIC .)
target_include_directories(react_codegen_AppSpecs PUBLIC .)
target_link_libraries(tm
jsi
react_nativemodule_core
react_codegen_AppSpecs)
它将tm
文件夹定义为原生代码的来源,并设置了必要的依赖项。
您需要将其添加为应用程序的依赖项,例如在android/app/build.gradle
文件的末尾:
android {
externalNativeBuild {
cmake {
path "src/main/jni/CMakeLists.txt"
}
}
}
确保选择正确的 android/app/build.gradle 文件,而不是 android/build.gradle。