Модули C++ Turbo Native¶
Внимание
Эта документация все еще является экспериментальной, и детали могут быть изменены по мере итераций. Не стесняйтесь делиться своими отзывами в обсуждении внутри рабочей группы для этой страницы.
Более того, она содержит несколько ручных шагов. Пожалуйста, обратите внимание, что это не будет представлять окончательный опыт разработчиков, когда Новая архитектура станет стабильной. Мы работаем над инструментами, шаблонами и библиотеками, которые помогут вам быстро начать работу с новой архитектурой без необходимости проходить всю процедуру настройки.
Это руководство показывает, как реализовать Turbo Native Module, используя только C++, что позволяет использовать одну и ту же реализацию на любой поддерживаемой платформе (Android, iOS, macOS или Windows).
Прежде чем продолжить работу с этим руководством, пожалуйста, прочитайте раздел Turbo Native Modules. В качестве дополнительной справки мы подготовили пример для приложения RNTester (NativeCxxModuleExample) и пример запуска в репозитории нашего сообщества (run/pure-cxx-module).
Модули C++ Turbo Native работают с включенной Новой архитектурой.
Чтобы перейти на Новую архитектуру, следуйте Руководству по миграции
Как создать модуль C++ Turbo Native¶
Чтобы создать модуль C++ Turbo Native Module, вам необходимо:
- Определить спецификацию JavaScript.
- Настроить Codegen на генерацию строительных лесов.
- Зарегистрируйте нативный модуль.
- Напишите нативный код для завершения реализации модуля.
Настройка тестового приложения для новой архитектуры¶
В качестве первого шага создайте новое приложение:
1 2 3 |
|
На Android включите новую архитектуру, изменив файл android/gradle.properties
:
1 2 |
|
На iOS включите Новую архитектуру при запуске pod install
в папке ios
:
1 |
|
Настройка папки турбо-модуля¶
Создайте папку tm
внутри проекта. Она будет содержать все турбомодули C++ вашего приложения. Конечный результат должен выглядеть следующим образом:
1 2 3 4 5 |
|
1. Спецификация JavaScript¶
Создайте следующую спецификацию в папке tm
:
NativeSampleModule.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
NativeSampleModule.js | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2. Конфигурация Codegen¶
Далее необходимо добавить некоторую конфигурацию для Codegen.
Приложение¶
Обновите файл package.json
вашего приложения следующими записями:
package.json | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Он добавляет необходимые свойства, которые мы позже будем повторно использовать в файле iOS podspec
, и настраивает Codegen на поиск спецификаций в папке tm
.
Модули C++ Turbo Native не автолинкуются и должны быть вручную включены в приложение с помощью описанных ниже шагов.
iOS: Создайте файл podspec
.¶
Для iOS вам потребуется создать файл AppTurboModules.podspec
в папке tm
— он будет выглядеть следующим образом:
AppTurboModules.podspec | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Вам нужно добавить его в качестве зависимости в ваше приложение в ios/Podfile
, например, после секции use_react_native!(...)
:
1 2 3 |
|
Android: build.gradle
, CMakeLists.txt
, Onload.cpp
.¶
Для Android вам нужно будет создать файл CMakeLists.txt
в папке tm
— он будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Он определяет папку tm
как источник нативного кода и устанавливает необходимые зависимости.
Вам нужно добавить его в качестве зависимости к вашему приложению в android/app/build.gradle
, например, в самом конце этого файла:
build.gradle | |
---|---|
1 2 3 4 5 6 7 |
|
Убедитесь, что выбрали правильный файл android/app/build.gradle
, а не android/build.gradle
.
3. Регистрация модуля¶
iOS¶
Чтобы зарегистрировать турбо-нативный модуль C++ в вашем приложении, вам нужно обновить ios/CxxTurboModulesGuide/AppDelegate.mm
со следующими записями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Это приведет к созданию NativeSampleModule
, связанного с именем NativeSampleModule
, как определено в нашем файле спецификации JavaScript ранее.
Android¶
Приложения Android по умолчанию не настроены на компиляцию нативного кода.
- Создайте папку
android/app/src/main/jni
. - Скопируйте
CMakeLists.txt
иOnload.cpp
из node_modules/react-native/ReactAndroid/cmake-utils/default-app-setup в папкуandroid/app/src/main/jni
.
Обновите Onload.cpp
следующими записями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Обновите CMakeLists.txt
следующими записями, например, в самом конце этого файла:
1 2 3 4 5 6 7 8 |
|
Это приведет к созданию NativeSampleModule
, связанного с именем NativeSampleModule
, определенным ранее в нашем файле спецификации JavaScript.
4. Нативный код на C++¶
На последнем этапе вам нужно будет написать нативный код, чтобы соединить JavaScript со своими родными платформами. Этот процесс требует двух основных шагов:
- Запустите Codegen и посмотрите, что он сгенерирует.
- Напишите свой родной код, реализующий сгенерированные интерфейсы.
Запустите Codegen¶
Следуйте руководству Codegen для получения общей информации.
На iOS Codegen запускается каждый раз при выполнении в папке ios
:
1 |
|
Вы можете просмотреть сгенерированные файлы AppSpecsJSI.h
и AppSpecsJSI-generated.cpp
в папке CxxTurboModulesGuide/ios/build/generated/ios
.
Эти файлы имеют префикс AppSpecs
, так как он соответствует параметру codegenConfig.name
, добавленному ранее в package.json
.
На Android Codegen запускается каждый раз при выполнении:
1 |
|
Вы можете просмотреть сгенерированные файлы AppSpecsJSI.h
и AppSpecsJSI-generated.cpp
в папке CxxTurboModulesGuide/android/app/build/generated/source/codegen/jni
.
Вам нужно запустить codegen заново только в том случае, если вы изменили спецификацию JavaScript.
Функция C++, сгенерированная для нашего файла спецификации JavaScript, выглядит следующим образом:
1 |
|
Вы можете напрямую работать с типами нижнего уровня jsi::
— но для удобства нативные модули C++ Turbo автоматически "перемыкают" типы в std::
.
Реализация¶
Теперь создайте файл NativeSampleModule.h
со следующим содержимым:
Из-за текущих различий в настройках CMake и CocoaPod нам потребуется немного творчества, чтобы включить правильный заголовок Codegen на каждой платформе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
В этом случае вы можете использовать любой тип C++, который мостит
к jsi::String
— по умолчанию или пользовательский тип. Вы не можете указать несовместимый тип, такой как bool
, float
или std::vector<>
, так как он не переходит
к jsi::String
и, следовательно, приводит к ошибке компиляции.
Теперь добавьте файл NativeSampleModule.cpp
с реализацией для него:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Поскольку мы добавили новые файлы C++, запускаемые в папке ios
:
1 |
|
для iOS. В Xcode они появляются под целью Pods
в подпапке Development Pods \ TurboModules
.
Теперь вы должны иметь возможность компилировать ваше приложение как на Android, так и на iOS.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
5. Добавление модуля C++ Turbo Native в ваше приложение¶
Для демонстрационных целей мы можем обновить App.tsx|jsx
нашего приложения следующими записями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Запустите приложение, чтобы увидеть ваш нативный модуль C++ Turbo в действии!
App TurboModuleProvider [Необязательно]¶
Вы можете избежать дублирования кода при добавлении нескольких модулей C++ Turbo Native Modules, объявив AppTurboModuleProvider:
AppTurboModuleProvider.h | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
И реализовать его:
AppTurboModuleProvider.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
А затем повторно использовать его в OnLoad.cpp
для Android и AppDelegate.mm
для iOS, например, через:
1 2 |
|
в соответствующих функциях.
Вызов API, специфичных для ОС¶
Вы все еще можете вызывать специфические для ОС функции в блоке компиляции (например, NS/CF
API на Apple или Win32/WinRT
API на Windows) при условии, что сигнатуры методов используют только std::
или jsi::
типы.
Для API, специфичных для Apple, вам нужно изменить расширение вашего файла реализации с .cpp
на .mm
, чтобы иметь возможность использовать API NS/CF
.
Расширение модулей C++ Turbo Native¶
Если вам нужно поддерживать некоторые типы, которые пока не поддерживаются, посмотрите это другое руководство.