0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OS之Rust開發(fā)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-29 17:19 ? 次閱讀

背景

Rust是一門靜態(tài)強類型語言,具有更安全的內(nèi)存管理、更好的運行性能、原生支持多線程開發(fā)等優(yōu)勢。Rust官方也使用Cargo工具來專門為Rust代碼創(chuàng)建工程和構(gòu)建編譯。 OpenHarmony為了集成C/C++ 代碼和提升編譯速度,使用了GN + Ninja的編譯構(gòu)建系統(tǒng)。GN的構(gòu)建語言簡潔易讀,Ninja的匯編級編譯規(guī)則直接高效。 為了在OpenHarmony中集成Rust代碼,并最大程度發(fā)揮Rust和OpenHarmony中原有C/C++ 代碼的交互性,采用GN作為統(tǒng)一構(gòu)建工具,即通過GN構(gòu)建Rust源碼文件(xxx.rs),并增加與C/C++互操作、編譯時lint、測試、IDL轉(zhuǎn)換、三方庫集成、IDE等功能。同時擴展gn框架,支持接口自動化轉(zhuǎn)換,最大程度簡化開發(fā)。


基本概念

術(shù)語描述
CargoCargo是Rust官方使用的構(gòu)建工具,允許Rust項目聲明其各種依賴項,并確保您始終獲得可重復(fù)的構(gòu)建。
cratecrate是一個獨立的可編譯單元。
LintLint是指出常見編程錯誤、錯誤、樣式錯誤和可疑結(jié)構(gòu)的工具??梢詫Τ绦蜻M行更加廣泛的錯誤分析。

配置規(guī)則

OpenHarmony提供了用于Rust代碼編譯構(gòu)建的各類型GN模板,可以用于編譯Rust可執(zhí)行文件,動態(tài)庫和靜態(tài)庫等。各類型模板說明如下:

GN模板功能輸出
ohos_rust_executablerust可執(zhí)行文件rust可執(zhí)行文件,不帶后綴
ohos_rust_shared_liaryrust動態(tài)庫rust dylib動態(tài)庫,默認后綴.dylib.so
ohos_rust_static_liaryrust靜態(tài)庫rust rlib靜態(tài)庫,默認后綴.rlib
ohos_rust_proc_macrorust proc_macrorust proc_macro庫, 默認后綴.so
ohos_rust_shared_ffirust FFI動態(tài)庫rust cdylib動態(tài)庫,給C/C++模塊調(diào)用,默認后綴.so
ohos_rust_static_ffirust FFI靜態(tài)庫rust staticlib庫,給C/C++模塊調(diào)用,默認后綴.a
ohos_rust_cargo_crate三方包Cargo craterust三方crate,支持rlib、dylib、bin
ohos_rust_systemtestrust系統(tǒng)測試用例rust可執(zhí)行系統(tǒng)測試用例,不帶后綴
ohos_rust_unittestrust單元測試用例rust可執(zhí)行單元測試用例,不帶后綴
ohos_rust_fuzztestrust Fuzz測試用例rust可執(zhí)行Fuzz測試用例,不帶后綴

配置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,如下所示:
```json
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í)行文件,運行結(jié)果如下:
./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應(yīng)用系統(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. 增加調(diào)用
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);
    //! 增加調(diào)用
    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.
---

注意:rust和openharmony其他開源代碼可以混合使用,如rust可以生成C/C庫,給其他C/C應(yīng)用使用,反之C/C++庫也可以給rust應(yīng)用調(diào)用
![](https://file1.elecfans.com//web2/M00/BF/BF/wKgaomW3baaAS-P1AABB9oinNkM39.webp)

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6523
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3607

    瀏覽量

    15956
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    4346
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙OS應(yīng)用程序開發(fā)

    這份學(xué)習(xí)文檔主要是帶領(lǐng)大家在鴻蒙OS上學(xué)習(xí)開發(fā)一個應(yīng)用程序,主要知識點如下:1、U-Boot引導(dǎo)文件燒寫方式;2、內(nèi)核鏡像燒寫方式;3、鏡像運行。
    發(fā)表于 09-11 14:39

    鴻蒙OS適用的全場景到底什么意思?

    鴻蒙系統(tǒng)(HarmonyOS),第一款基于微內(nèi)核的全場景分布式OS,是華為自主研發(fā)的操作系統(tǒng)。華為在開發(fā)者大會HDC.2019上正式發(fā)布了鴻蒙系統(tǒng),該系統(tǒng)將率先部署在智慧屏、車載終端、
    發(fā)表于 09-25 09:25

    鴻蒙os系統(tǒng)是什么意思 鴻蒙os系統(tǒng)有什么作用

    大家都很熟悉華為,那么華為近年新研發(fā)出來的鴻蒙os系統(tǒng)是什么意思?下面與大家分享華為鴻蒙os系統(tǒng)是什么意思的教程。鴻蒙
    發(fā)表于 12-17 11:34

    鴻蒙 OS 應(yīng)用開發(fā)初體驗

    的操作系統(tǒng)平臺和開發(fā)框架。HarmonyOS 的目標(biāo)是實現(xiàn)跨設(shè)備的無縫協(xié)同和高性能。 DevEco Studio 對標(biāo) Android Studio,開發(fā)鴻蒙 OS 應(yīng)用的 IDE。
    發(fā)表于 11-02 19:38

    華為鴻蒙OS又有嚇人的設(shè)計 蘋果的Carplay在鴻蒙OS面前真的自嘆不如

    華為鴻蒙OS終于在外界的關(guān)注下發(fā)布,作為華為自主研發(fā)的操作系統(tǒng),鴻蒙OS還是承載了太多人的期盼。華為鴻蒙
    的頭像 發(fā)表于 08-27 10:25 ?8798次閱讀

    華為鴻蒙OS 2.0帶來哪些智慧體驗?

    華為已經(jīng)定于12月16日在北京發(fā)布鴻蒙OS 2.0手機開發(fā)者Beta版本。這不僅是手機鴻蒙OS的首次亮相,同時也意味著手機
    的頭像 發(fā)表于 12-15 15:10 ?2007次閱讀

    鴻蒙OS 2.0手機開發(fā)者Beta版發(fā)布會在京舉辦

    三個月前,鴻蒙OS 2.0正式在華為開發(fā)者大會2020亮相。12月16日,鴻蒙OS 2.0手機開發(fā)
    的頭像 發(fā)表于 12-16 09:29 ?1.9w次閱讀

    華為正式推出鴻蒙OS的手機開發(fā)者Beta版

    12月16日上午消息,華為今日宣布正式推出鴻蒙OS的手機開發(fā)者Beta版,華為消費者業(yè)務(wù)軟件部總裁王成錄表示,今年已有美的、九陽、老板電器、海雀科技搭載鴻蒙
    的頭像 發(fā)表于 12-16 10:37 ?2552次閱讀

    鴻蒙OS2.0手機開發(fā)者Beta版登場

    12 月 16 日,華為宣布正式推出鴻蒙 OS 的手機開發(fā)者 Beta 版,并正式面向個人/企業(yè)開發(fā)者公測鴻蒙 2.0,
    的頭像 發(fā)表于 12-16 14:39 ?2155次閱讀

    華為發(fā)布鴻蒙OS Beta版

    昨天華為發(fā)布鴻蒙OS Beta版了?鴻蒙系統(tǒng)一直在按照既有步伐前進,現(xiàn)在華為發(fā)布鴻蒙OS Beta版,而且一些生態(tài)
    的頭像 發(fā)表于 12-17 08:41 ?2815次閱讀

    鴻蒙OS與Lite OS的區(qū)別是什么

    鴻蒙OS鴻蒙OS面向未來、面向全場景、分布式。在單設(shè)備系統(tǒng)能力基礎(chǔ)上,鴻蒙OS提出了基于同一套系
    的頭像 發(fā)表于 12-24 12:40 ?4742次閱讀

    華為鴻蒙OS 2.0開發(fā)者公測版本大批量向已申請開發(fā)者推送

    4 月 27 日,華為鴻蒙 OS 2.0 開發(fā)者公測版本大批量向已申請的開發(fā)者推送,隨后網(wǎng)上出現(xiàn)大量鴻蒙
    的頭像 發(fā)表于 05-12 09:26 ?3001次閱讀

    鴻蒙os怎么升級

    6月2日,華為正式發(fā)布了鴻蒙armonyOS 2系統(tǒng),那么鴻蒙os如何升級?現(xiàn)將鴻蒙os升級方式告知如下。
    的頭像 發(fā)表于 06-08 16:26 ?2666次閱讀

    華為開發(fā)者大會2021鴻蒙os在哪場

    華為開發(fā)者大會2021將在10月22日-24日舉辦,地點為東莞松山湖,鴻蒙os 3.0或?qū)⑴c我們見面,那么華為開發(fā)者大會2021鴻蒙
    的頭像 發(fā)表于 10-22 15:24 ?1829次閱讀

    [鴻蒙]OpenHarmony4.0的Rust開發(fā)

    背景 Rust 是一門靜態(tài)強類型語言,具有更安全的內(nèi)存管理、更好的運行性能、原生支持多線程開發(fā)等優(yōu)勢。Rust 官方也使用 Cargo 工具來專門為 Rust 代碼創(chuàng)建工程和構(gòu)建編譯
    的頭像 發(fā)表于 02-26 17:28 ?731次閱讀
    [<b class='flag-5'>鴻蒙</b>]OpenHarmony4.0的<b class='flag-5'>Rust</b><b class='flag-5'>開發(fā)</b>