随着 OpenHarmony 生态逐步成熟,越来越多开发者开始关注如何在鸿蒙平台上引入 Rust,以获得更好的内存安全性、性能表现与工程可维护性。ohos-rs 正是在这样的背景下出现的:它是一个用于在 OpenHarmony SDK 上构建 Rust 原生能力的框架,并通过 Node-API 与鸿蒙应用侧进行交互,整体思路源自并 Fork 自 napi-rs。什么是 ohos-rs?
ohos-rs是一个允许开发者通过 Node-API (N-API) 使用 Rust 构建 OpenHarmony 编译的 SDK/动态链接库的框架。它是大名鼎鼎的 napi-rs 的 Fork 版本。由于鸿蒙 ArkTS 底层依赖 ArkCompiler,而 ArkCompiler 与 Native 层的交互标准正是基于 Node-API(N-API),因此 ohos-rs 完美继承了 napi-rs 的优秀基因,让 Rust 代码可以零成本、无缝地被 ArkTS 调用。项目仓库:https://github.com/ohos-rs/ohos-rs为什么选择 ohos-rs?
告别样板代码:传统的 C++ Node-API 开发需要写大量繁琐的类型转换代码。ohos-rs 提供了强大的 #[napi] 宏,只需一行代码即可自动暴露 Rust 函数。自动生成 ArkTS 声明:编译时自动生成 .d.ts 类型声明文件,ArkTS 调用时享受完美的 IDE 代码补全和类型检查。内存安全与高性能:兼得 Rust 的安全性和与 C 媲美的运行速度。丰富的 N-API 支持:支持 Promise、Buffer、TypedArray、异步任务流等高级特性。实战
接下来,我们将通过一个简单的示例,演示如何使用 ohos-rs 编写 Rust 代码,并在 DevEco Studio 中被 ArkTS 调用。1. 环境准备
在开始之前,请确保你的开发环境已经安装了以下工具:DevEco Studio& OpenHarmony/HarmonyOS SDK安装 ohos-rs 提供的 CLI 工具(类似 napi-cli):npm install -g @ohos-rs/cli
2. 初始化项目
ohos-rs new my-ohos-libcd my-ohos-lib
在生成的 Cargo.toml 中,你可以看到核心依赖项是 ohos-rs (内部可能映射为针对 ohos 适配的 napi 和 napi-derive):[dependencies]napi = { version = "...", package = "ohos-napi" }napi-derive = { version = "...", package = "ohos-napi-derive" }
(注:具体依赖名称和版本请参考 ohos-rs 最新文档)3. 编写 Rust 核心代码
打开 src/lib.rs。我们将编写两个功能:一个是简单的加法计算,另一个是处理字符串。use napi_derive::napi;// 使用 #[napi] 宏,自动将该函数导出给 ArkTS#[napi]pub fn add(a: u32, b: u32) -> u32 { a + b}#[napi]pub fn greet(name: String) -> String { format!("Hello, {}! Powered by Rust and ohos-rs.", name)}
就这么简单!没有任何复杂的 napi_get_cb_info 或是数据类型转换,宏已经替我们在底层处理好了。4. 编译输出动态链接库
配置好针对 OpenHarmony 的交叉编译目标(如 aarch64-unknown-linux-ohos)后,执行构建命令:构建完成后,在产物目录中你会得到两个极其重要的文件:libmy_ohos_lib.so:编译好的 Rust 动态链接库。index.d.ts:自动生成的 TypeScript 声明文件。index.d.ts 的内容大概长这样,完全符合 ArkTS 的类型标准:export function add(a: number, b: number): number;export function greet(name: string): string;
5. 在 DevEco Studio (ArkTS) 中集成调用
将生成的 libmy_ohos_lib.so 放入 DevEco Studio 鸿蒙工程的 entry/src/main/cpp/libs/arm64-v8a/ 目录下(如果没有则创建)。将 index.d.ts 和生成的 ohos-rs 绑定 JS/TS 入口文件放入 entry/src/main/ets/utils/ (或其他合适的位置)。在 CMakeLists.txt 中配置链接(如果是标准的 Native C++ 工程),或者直接在 oh-package.json5 中通过本地依赖的方式引入。在你的 ArkTS 页面代码(如 Index.ets)中调用:import { add, greet } from '../utils/my_ohos_lib'; // 引入 Rust 生成的绑定import hilog from '@ohos.hilog';@Entry@Componentstruct Index { @State message: string = 'Waiting for Rust...'; build() { Row() { Column() { Text(this.message) .fontSize(20) .fontWeight(FontWeight.Bold) .margin({ bottom: 20 }) Button('Call Rust Function') .onClick(() => { // 1. 调用 Rust 的加法 let sum = add(100, 200); hilog.info(0x0000, 'OhosRs', `100 + 200 = ${sum}`); // 2. 调用 Rust 的字符串处理 this.message = greet("HarmonyOS Developer"); }) } .width('100%') } .height('100%') }}
点击按钮,UI 上的文本将瞬间刷新为 Rust 返回的字符串,同时后台打印出正确的计算结果。进阶玩法:异步与多线程
在实际开发中,如果我们在 Native 层执行耗时操作(比如读写大文件、图像滤镜),会阻塞 ArkTS 的主线程(UI 线程)。ohos-rs 完美支持 Node-API 的异步操作。你可以使用 AsyncTask 将耗时的 Rust 逻辑放到后台线程池执行,并自动向 ArkTS 返回一个 Promise:use napi::{Task, Env, Result, JsPromise};use napi_derive::napi;use std::thread;use std::time::Duration;struct HeavyComputeTask { input: u32,}#[napi]impl Task for HeavyComputeTask { type Output = u32; type JsValue = u32; // 在后台线程执行(不阻塞 UI) fncompute(&mut self) -> Result<Self::Output> { thread::sleep(Duration::from_secs(2)); // 模拟耗时 Ok(self.input * 10) } // 将结果转换回 JS 类型,在主线程执行 fnresolve(&mut self, _env: Env, output: Self::Output) -> Result<Self::JsValue> { Ok(output) }}// 暴露给 ArkTS 的异步函数#[napi]pub fn async_compute(input: u32) -> AsyncTask<HeavyComputeTask> { AsyncTask::new(HeavyComputeTask { input })}
在 ArkTS 中,你可以使用 await 优雅地调用它:let result = awaitasync_compute(5); // 2秒后返回 50
总结
随着鸿蒙生态的爆发式增长,跨平台、高性能的底层开发需求日益旺盛。ohos-rs站在了 napi-rs 巨人的肩膀上,为 OpenHarmony 提供了一条最现代、最安全的 Native 开发路径。它极大地降低了 ArkTS 开发者调用底层系统接口和复用 C/C++/Rust 生态的门槛。如果你正在开发鸿蒙应用,并且受够了 C++ N-API 的繁琐,或者想要把现有的 Rust 库移植到鸿蒙平台,强烈建议你尝试一下!参考资料
- ohos-rs https://github.com/ohos-rs/ohos-rs
- 鸿蒙ArkTS调用Rust https://developer.huawei.com/consumer/cn/blog/topic/03166271011531112
- 如何基于ohos-rs使用Rust开发鸿蒙Native模块 https://juejin.cn/post/7372466344144437289
- 使用 ohos-rs/Rust 开发鸿蒙原生模块常见问题以及排查方案和思路 https://juejin.cn/post/7385374015543099427
- Rust+HarmonyOS: 编译纯血鸿蒙的oh-napi https://juejin.cn/post/7366576158790418432