当前位置:

首页 > Rust Development in OpenHarmony 4.0

Rust Development in OpenHarmony 4.0

想了解更多关于开源的内容,请访问:51CTO鸿蒙开发者社区https://ost.51cto.com背景Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。OpenHarmony为了集成C/C++代码和提升编译速度,使用了GN+Ninja的编译构建系统。GN的构建语言简洁易读,Ninja的汇编级编译规则直接高效。为了在OpenHarmony中集成Rust代码,并最大程度发挥Rust和OpenH

OpenHarmony 4.0的 Rust 开发

想了解更多关于开源的内容,请访问:

51CTO 鸿蒙开发者社区

https://ost.51cto.com

背景

Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C++ 代码和提升编译速度,使用了GN + Ninja的编译构建系统。GN的构建语言简洁易读,Ninja的汇编级编译规则直接高效。 为了在OpenHarmony中集成Rust代码,并最大程度发挥Rust和OpenHarmony中原有C/C++ 代码的交互性,采用GN作为统一构建工具,即通过GN构建Rust源码文件(xxx.rs),并增加与C/C++互操作、编译时lint、测试、IDL转换、三方库集成、IDE等功能。同时扩展gn框架,支持接口自动化转换,最大程度简化开发。

基本概念

术语

描述

Cargo

Cargo是Rust官方使用的构建工具,允许Rust项目声明其各种依赖项,并确保您始终获得可重复的构建。

crate

crate是一个独立的可编译单元。

Lint

Lint是指出常见编程错误、错误、样式错误和可疑结构的工具。可以对程序进行更加广泛的错误分析。

配置规则

OpenHarmony提供了用于Rust代码编译构建的各类型GN模板,可以用于编译Rust可执行文件,动态库和静态库等。各类型模板说明如下:

GN模板

功能

输出

ohos_rust_executable

rust可执行文件

rust可执行文件,不带后缀

ohos_rust_shared_library

rust动态库

rust dylib动态库,默认后缀.dylib.so

ohos_rust_static_library

rust静态库

rust rlib静态库,默认后缀.rlib

ohos_rust_proc_macro

rust proc_macro

rust proc_macro库, 默认后缀.so

ohos_rust_shared_ffi

rust FFI动态库

rust cdylib动态库,给C/C++模块调用,默认后缀.so

ohos_rust_static_ffi

rust FFI静态库

rust staticlib库,给C/C++模块调用,默认后缀.a

ohos_rust_cargo_crate

三方包Cargo crate

rust三方crate,支持rlib、dylib、bin

ohos_rust_systemtest

rust系统测试用例

rust可执行系统测试用例,不带后缀

ohos_rust_unittest

rust单元测试用例

rust可执行单元测试用例,不带后缀

ohos_rust_fuzztest

rust Fuzz测试用例

rust可执行Fuzz测试用例,不带后缀

配置Rust静态库示例

该示例用于测试Rust可执行bin文件和静态库rlib文件的编译,以及可执行文件对静态库的依赖,使用模板ohos_rust_executable和ohos_rust_static_library。操作步骤如下:

  • 创建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)
    }

    创建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);
    }

    配置gn脚本build/rust/tests/test_rlib_crate/BUILD.gn,如下所示:

    import("//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" ]
    }

    执行编译得到的可执行文件,运行结果如下:

    ./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应用系统库示例

    增加依赖:

    // GN 里增加依赖
    ohos_rust_executable("test_dylib_crate") {
    sources = [ "src/main.rs" ]
    deps = [ ":simple_printer_dylib" ]
    # 增加外部依赖
    external_deps = [ "hilog:hilog_rust" ]
    }
    
    // bundle.json 里增加依赖
    "components": [
    "hilog"
    ],

    增加调用:

    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.");
    }

    运行测试:

    // 运行
    # ./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应用使用,反之C/C++库也可以给rust应用调用

    总结

    • OpenHarmony已经全面支持的rust开发,一些工具部件如hilog也有对应的rust版本。
    • 社区文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-rust-compilation.md。
    • 社区样例:https://gitee.com/openharmony/build rust目录下有各种样例。

    想了解更多关于开源的内容,请访问:

    51CTO 鸿蒙开发者社区

    https://ost.51cto.com

    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    相关文章 更多
    AE基础教程:如何创建合成并制作关键帧动画
    AE基础教程:如何创建合成并制作关键帧动画

    本文指导After Effects新手完成从打开软件到制作简单动画的完整流程。内容涵盖新建合成、导入素材、添加关键帧及预览验证,适用于AE基础学习。读者可依据步骤快速完成首个可播放的动效项目。

    电影剪辑实战:镜头组织、节奏控制与声音衔接技巧
    电影剪辑实战:镜头组织、节奏控制与声音衔接技巧

    本文详解电影剪辑核心流程,从素材整理、镜头空间组织到叙事节奏压缩,再到J-cut/L-cut声音衔接技巧。通过粗剪保逻辑、精剪压停顿、反应镜头缓冲及电平统一检查,帮助创作者打造空间清晰、情绪连贯且听感自然的成片。

    转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧
    转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧

    本文详解硬切、遮挡转场和运镜转场的适用场景与操作逻辑。通过对比三种转场的核心区别,提供基于素材条件和叙事目的的判断标准,帮助剪辑师避免滥用特效,掌握自然衔接画面的实战技巧。

    GitLab新手创建项目并推送第一次提交的操作指南
    GitLab新手创建项目并推送第一次提交的操作指南

    本文指导GitLab新手完成创建项目并推送第一次提交的最小闭环。涵盖远程项目创建、本地仓库初始化、添加远程地址及执行git push。重点说明HTTPS与SSH认证差异、分支名(master/main)核对及提交验证标准,确保远程仓库真正建立。

    抖音拍摄剪辑教程:从竖屏运镜到卡点成片
    抖音拍摄剪辑教程:从竖屏运镜到卡点成片

    本教程针对抖音竖屏视频制作,涵盖拍摄前构思、稳定运镜、粗剪筛选、音乐卡点及导出检查全流程。重点在于拍摄时预留字幕空间、利用动作节点辅助剪辑,以及通过鼓点对齐画面。适用于新手快速完成第一条完整成片,强调素材质量与节奏自然,避免过度特效与版权风险。

    饭圈舞台照修图:降噪、调色与人物突出技巧
    饭圈舞台照修图:降噪、调色与人物突出技巧

    针对饭圈舞台照光线乱、噪点多、背景抢眼的痛点,本文提供“保脸、控光、突出主体”的修图方案。核心步骤包括:利用Lightroom降噪面板处理高ISO颗粒,控制曝光避免高光死白或脸部死黑;通过压低背景色彩、提升人物亮度与对比度来修正舞台灯光导致的肤色偏差;最后通过裁剪去除杂乱元素,确保人物主体清晰且肤色自然。

    Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南
    Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南

    本文提供Photoshop完整安装指南,涵盖Windows/macOS系统要求、Creative Cloud客户端部署及常见启动故障排查。通过安装前磁盘与账号检查、安装中网络监控、安装后功能测试三步法,解决安装中断、登录失败及启动卡顿问题,确保软件稳定可用。

    创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查
    创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查

    本文提供创维电视通过U盘安装第三方APK的完整操作指南。核心步骤包括:准备格式化的U盘与正规APK文件,在酷开系统“应用管理”中找到安装入口,临时开启“允许安装未知来源应用”权限,以及安装后的功能测试与权限关闭。适用于解决电视无法识别U盘、提示解析失败或权限受限等问题,确保安装安全且不影响系统稳定。

    Excel筛选大于指定数值:操作步骤与结果验证
    Excel筛选大于指定数值:操作步骤与结果验证

    本教程演示如何在Excel中筛选大于指定数值的数据。核心步骤包括:确保数据连续、选中表头、通过“开始→排序和筛选”开启筛选,并在“数字筛选”中选择“大于”输入阈值。筛选仅隐藏不符合条件的行,不删除数据。完成后需逐行验证可见数据是否均大于阈值,并可通过取消筛选恢复全部数据。

    Creo零基础入门:新建零件与第一次拉伸建模完整指南
    Creo零基础入门:新建零件与第一次拉伸建模完整指南

    本教程指导Creo初学者完成首个拉伸实体建模。通过新建零件、选择mmns_part_solid模板、定义草绘平面及绘制封闭轮廓,生成三维实体。内容涵盖操作路径、参数设置及常见错误排查,帮助新手建立正确的建模逻辑与单位概念。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘
    Windows/macOS/iOS/Android

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。