背景
Rust 是一門靜態(tài)強類型語言,具有更安全的內存管理、更好的運行性能、原生支持多線程開發(fā)等優(yōu)勢。Rust 官方也使用 Cargo 工具來專門為 Rust 代碼創(chuàng)建工程和構建編譯。 OpenHarmony 為了集成 C/C++ 代碼和提升編譯速度,使用了 GN + Ninja 的編譯構建系統(tǒng)。GN 的構建語言簡潔易讀,Ninja 的匯編級編譯規(guī)則直接高效。 為了在 OpenHarmony 中集成 Rust 代碼,并最大程度發(fā)揮 Rust 和 OpenHarmony 中原有 C/C++ 代碼的交互性,采用 GN 作為統(tǒng)一構建工具,即通過 GN 構建 Rust 源碼文件(xxx.rs),并增加與 C/C++ 互操作、編譯時 lint、測試、IDL 轉換、三方庫集成、IDE 等功能。同時擴展 gn 框架,支持接口自動化轉換,最大程度簡化開發(fā)。
基本概念
配置規(guī)則
OpenHarmony 提供了用于 Rust 代碼編譯構建的各類型 GN 模板,可以用于編譯 Rust 可執(zhí)行文件,動態(tài)庫和靜態(tài)庫等。各類型模板說明如下:
配置 Rust 靜態(tài)庫示例
該示例用于測試 Rust 可執(zhí)行 bin 文件和靜態(tài)庫 rlib 文件的編譯,以及可執(zhí)行文件對靜態(tài)庫的依賴,使用模板 ohos_rust_executable 和 ohos_rust_static_library。操作步驟如下:
1.創(chuàng)建 build/rust/tests/test_rlib_crate/src/simple_printer.rs,如下所示:
//! simple_printer /// struct RustLogMessage pub struct RustLogMessage { /// i32: id pub id: i32, /// String: msg pub msg: String, } /// function rust_log_rlib pub fn rust_log_rlib(msg: RustLogMessage) { println!("id:{} message:{:?}", msg.id, msg.msg) } ?
2.創(chuàng)建 build/rust/tests/test_rlib_crate/src/main.rs,如下所示:
//! rlib_crate example for Rust. extern crate simple_printer_rlib; use simple_printer_rlib::rust_log_rlib; use simple_printer_rlib::RustLogMessage; fn main() { let msg: RustLogMessage = RustLogMessage { id: 0, msg: "string in rlib crate".to_string(), }; rust_log_rlib(msg); } ?
3.配置 gn 腳本 build/rust/tests/test_rlib_crate/BUILD.gn,如下所示:
import("http://build/ohos.gni") ohos_rust_executable("test_rlib_crate") { sources = [ "src/main.rs" ] deps = [ ":simple_printer_rlib" ] } ohos_rust_static_library("simple_printer_rlib") { sources = [ "src/simple_printer.rs" ] crate_name = "simple_printer_rlib" crate_type = "rlib" features = [ "std" ] } ?
4.執(zhí)行編譯得到的可執(zhí)行文件,運行結果如下:
./build.sh --product-name rk3568 --build-target build/rust/tests:tests --no-prebuilt-sdk hdc_std.exe shell mount -o rw,remount / hdc_std.exe shell file send test_dylib_crate /data/local/tmp hdc_std.exe file send libsimple_printer_dylib.dylib.so /system/lib hdc_std.exe shell # cd /data/local/tmp # chmod +x test_dylib_crate # ./test_dylib_crate id:0 message:"string in rlib crate"
?
配置 Rust 應用系統(tǒng)庫示例
1.增加依賴
// GN 里增加依賴 ohos_rust_executable("test_dylib_crate") { sources = [ "src/main.rs" ] deps = [ ":simple_printer_dylib" ] # 增加外部依賴 external_deps = [ "hilog:hilog_rust" ] } // bundle.json 里增加依賴 "components": [ "hilog" ],
?
2.增加調用
extern crate simple_printer_dylib; use simple_printer_dylib::rust_log_dylib; use simple_printer_dylib::RustLogMessage; //! 增加引用 use std::ffi::{ c_char, CString }; use hilog_rust::{hilog, info, HiLogLabel, LogType}; const LOG_LABEL: HiLogLabel = HiLogLabel { log_type: LogType::LogCore, domain: 0xD002220, tag: "TEST_RUST", }; fn main() { let msg: RustLogMessage = RustLogMessage { id: 0, msg: "string in rlib crate".to_string(), }; rust_log_dylib(msg); //! 增加調用 info!(LOG_LABEL, "Fnished enable all keys."); } ?
3.運行測試
// 運行 # ./test_dylib_crate id:0 message:"string in rlib crate" // 查看hilog # hilog | grep Fnished 08-17 05:14:18.121 29293 29293 I C02220/TEST_RUST: Fnished enable all keys.
為了能讓大家更好的學習鴻蒙 (OpenHarmony) 開發(fā)技術,這邊特意整理了《鴻蒙 (OpenHarmony)開發(fā)學習手冊》,希望對大家有所幫助:
《鴻蒙(Harmony OS)開發(fā)學習手冊》
入門必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用開發(fā)導讀(ArKTS)
2.……
HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系統(tǒng)定義
2.技術框架
3.技術特性
4.系統(tǒng)安全
快速入門:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.構建第一個ArkTS應用
3.構建第一個JS應用
4…
開發(fā)基礎知識:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.應用基礎知識
2.配置文件
3.應用數(shù)據(jù)管理
4.應用安全管理
5.應用隱私保護
6.三方應用調用管控機制
7.資源分類與訪問
8.學習ArkTS
9…
基于ArkTS 開發(fā):https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability開發(fā)
2.UI開發(fā)
3.公共事件與通知
4.窗口管理
5.媒體
6.安全
7.網(wǎng)絡與鏈接
8.電話服務
9.數(shù)據(jù)管理
10.后臺任務(Background Task)管理
11.設備管理
12.設備使用信息統(tǒng)計
13.DFX
14.國際化開發(fā)
15.折疊屏系列
16………
-
Rust
+關注
關注
1文章
230瀏覽量
6664 -
鴻蒙
+關注
關注
57文章
2392瀏覽量
43050 -
OpenHarmony
+關注
關注
25文章
3744瀏覽量
16577
發(fā)布評論請先 登錄
相關推薦
評論