-
Tạo template Expo với tabs:
npx create-expo-app --template tabs
-
Tạo native module:
npx create-expo-module expo-settings
-
Xóa các file không cần thiết:
cd modules/expo-settings rm ios/ExpoSettingsView.swift rm android/src/main/java/expo/modules/settings/ExpoSettingsView.kt rm src/ExpoSettingsView.tsx src/ExpoSettingsView.web.tsx src/ExpoSettingsModule.web.ts -
Sửa các file còn lại để loại bỏ code thừa:
ExpoSettingsModule.ktExpoSettings.types.tsExpoSettingsModule.ts
-
Thêm file
index.tstrong thư mục module để export các hàm cần thiết.
-
Tạo module Rust:
cd modules cargo new --lib rust-modules -
Thêm các phụ thuộc cho Rust module trong
Cargo.toml:[dependencies] jni = "0.21.0" [lib] crate-type = ["staticlib", "cdylib"]
-
Sửa file
src/lib.rstrong module Rust để định nghĩa các hàm cần thiết.
-
Thêm target iOS:
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
-
Biên dịch mã Rust cho iOS:
cargo build --release --target aarch64-apple-ios cargo build --release --target aarch64-apple-ios-sim
-
Copy file
librust_modules.avào thư mục:modules/expo-settings/ios/rust -
Cài đặt
cbindgenđể tạo file header C:cargo install cbindgen cbindgen --lang c --crate rust-modules --output rust-modules.h
Copy file
rust-modules.hvào thư mụcmodules/expo-settings/ios/rust. -
Thêm đường dẫn thư viện vào
ExpoSettings.podspec:s.vendored_libraries = "rust/librust_modules.a"
-
Thêm hàm vào
NativeModule.swift:Function("rustAdd") { (a: Int32, b: Int32) -> Int32 in return rust_add(a, b) }
-
Cài đặt dependencies và build lại dự án:
pod install --project-directory=ios
-
Biên dịch mã Rust cho các kiến trúc Android:
cargo ndk --target aarch64-linux-android --platform 31 build --release cargo ndk --target armv7-linux-androideabi --platform 31 build --release cargo ndk --target x86_64-linux-android --platform 31 build --release cargo ndk --target i686-linux-android --platform 31 build --release
-
Tạo thư mục
jniLibsvà các thư mục con:modules/expo-settings/android/src/main/jniLibs/ ├── arm64-v8a ├── armeabi-v7a ├── x86_64 └── x86 -
Copy file
.sovào các thư mục tương ứng:arm64-v8a -> librust_modules.so armeabi-v7a -> librust_modules.so x86_64 -> librust_modules.so x86 -> librust_modules.so -
Thêm đoạn code nạp thư viện Rust trong
ExpoSettingsModule.kt:companion object { init { System.loadLibrary("rust_modules") } }
Lưu ý: Tên trong
System.loadLibraryphải khớp với tên file.so. Nếu file.socó tênlibrust_modules.so, hãy sử dụngSystem.loadLibrary("rust_modules"). -
Thêm khai báo hàm native:
external fun rust_add(a: Int, b: Int): Int
-
Thêm hàm trung gian để React Native có thể gọi:
Function("rust_add") { a: Int, b: Int -> rust_add(a, b) }
-
Build lại dự án (cần development build hoặc eject):
yarn android
- Đảm bảo tên module trong
Cargo.tomlkhớp với tên thư viện được nạp trên Android và iOS. - Nếu gặp lỗi, kiểm tra logcat (Android) hoặc Xcode logs (iOS) để debug.