鸿蒙OS之Rust开发

背景

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框架,支持接口自动化转换,最大程度简化开发。


基本概念
术语描述
CargoCargo是Rust官方使用的构建工具,允许Rust项目声明其各种依赖项,并确保您始终获得可重复的构建。
cratecrate是一个独立的可编译单元。
LintLint是指出常见编程错误、错误、样式错误和可疑结构的工具。可以对程序进行更加广泛的错误分析。
配置规则

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

GN模板功能输出
ohos_rust_executablerust可执行文件rust可执行文件,不带后缀
ohos_rust_shared_libraryrust动态库rust dylib动态库,默认后缀.dylib.so
ohos_rust_static_libraryrust静态库rust rlib静态库,默认后缀.rlib
ohos_rust_proc_macrorust proc_macrorust proc_macro库, 默认后缀.so
ohos_rust_shared_ffirust FFI动态库rust cdylib动态库,给C/C++模块调用,默认后缀.so
ohos_rust_static_ffirust FFI静态库rust staticlib库,给C/C++模块调用,默认后缀.a
ohos_rust_cargo_crate三方包Cargo craterust三方crate,支持rlib、dylib、bin
ohos_rust_systemtestrust系统测试用例rust可执行系统测试用例,不带后缀
ohos_rust_unittestrust单元测试用例rust可执行单元测试用例,不带后缀
ohos_rust_fuzztestrust Fuzz测试用例rust可执行Fuzz测试用例,不带后缀
配置Rust静态库示例

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

  1. 创建build/rust/tests/test_rlib_crate/src/simple_printer.rs,如下所示:

    //! simple_printer/// struct RustLogMessagepub struct RustLogMessage {/// i32: idpub id: i32,/// String: msgpub msg: String,
    }/// function rust_log_rlib
    pub fn rust_log_rlib(msg: RustLogMessage) {println!("id:{} message:{:?}", msg.id, msg.msg)
    }
    
  2. 创建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("//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" ]
}```
  1. 执行编译得到的可执行文件,运行结果如下:
```shell
./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/libhdc_std.exe shell
# cd /data/local/tmp
# chmod +x test_dylib_crate
# ./test_dylib_crate
id:0 message:"string in rlib crate"```
配置Rust应用系统库示例
  1. 增加依赖
```json
// GN 里增加依赖
ohos_rust_executable("test_dylib_crate") {sources = [ "src/main.rs" ]deps = [ ":simple_printer_dylib" ]# 增加外部依赖external_deps = [ "hilog:hilog_rust" ]
}// bundle.json 里增加依赖
"components": ["hilog"
],```
  1. 增加调用
```rust
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.");
}```
  1. 运行测试
```shell
// 运行
# ./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应用调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438694.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识产品经理 一个合格的产品经理 产品经理分类

目录 一.合格的产品经理 什么是产品 什么是产品经理 合格的产品经理 什么是产品?区别是? 什么是产品经理 合格的产品经理需要关注哪些核心问题? 二.产品经理分类 为什么会有不同类型 都有那些类型 根据不同类型的职责特点规划个人…

LAN安全及概念

实验大纲 一、终端安全 1.当前比较流行的网络攻击 2.常见的网络安全设备 3.终端受到攻击的主要途径 4.传统的基于主机的安全防护手段 二、访问控制 1.本地口令验证 2.AAA组成 3.身份验证 4.记账 5. 802.1X 三、第2层安全威胁 交换机攻击分类 四、MAC地址表 MAC地…

CC核心内容

目录 标准流: 盒子模型: 1.标准盒子模型 2.怪异盒子模型 浮动: 定位: 标准流、盒子模型、浮动、定位 Div是一个块级元素,span是内行元素 div元素通常用于创建一个独立的区块,它会单独占据一行或多行的空间 span元素通常用于包裹文本或内行元素&…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记(三) 绘制第一个图形 OpenGL/C_学习笔记(四)空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

Gitlab7.14 中文版安装教程

Gitlab7.14 中文版安装教程 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com转发本文请备注原文链接,本文内容整理日期:2024-01-28csdn 博客名称:五维空间-影子,欢迎关注 …

企业软件项目成果-图像识别

电子标绘系统:http://t.csdnimg.cn/h8kHN 下面图像识别仅仅使用了OpenCV库而已,并没有涉及深度学习、机器学习。 整盘样本的拍照识别结果(识别准确率达100%): 宫颈刷图像识别的测试结果(识别准确率达1…

分布式事务入门,最终一致性方案

分布式事务 回顾分布式事务 上篇内容我们说到了分布式事务的基本内容,讲到了分布式事务的实现主要有事务协调以及最终一致性两件事情来完成整个逻辑。 那么上个文章我们说过了 2PC、3PC、XA 三种协调事务的协议,这次我们来说事务协调处理完成后&#x…

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成(Docker 三要素) 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …

百望云受邀参加2024数据要素创新发展大会 共同发布“匿名数据网络”

近日,由中国信息通信研究院(以下简称“中国信通院”)泰尔终端实验室主办的2024数据要素创新发展大会在天津举办。百望云受邀参会,与中国信通院、中移信息、联通在线、天翼数字生活、个推、极光、中互数科、数据空间研究院等行业企业共同发布了…

从零开发短视频电商 Tesseract OCR识别增强

文章目录 概要图像预处理阶段默认反转图像重新缩放二值化噪音消除膨胀/腐蚀旋转/偏移校正边框缺少边框边框太大扫描边框去除 透明度/Alpha通道 引擎处理阶段语言模型配置提高识别速度词典、单词列表和模式表格识别 使用 Tesseract OCR 的 GUI 和其他项目 原文如下: …

群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务,并结合cpolar内网穿透工具生成的公网地址,通过移动客户端ES文件浏览器即可实现移动设…

网络基础二 session、cookie、token

HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、…