怎样基于ohos-rs使用Rust开发鸿蒙Native模块_鸿蒙 rust
开端:
在开始阅读本文之前,你最好有如下背景才能够更好的阅读并且进行实践:
本文将会讲解如何使用Rust以及ohos-rs开发一个鸿蒙Native模块。
背景
在鸿蒙原生应用开发中,我们通常会使用 ArkTS 作为开发语言,其提供了包括UI以及各种内置工具库的强大能力,不过在某些场景下,我们依旧需要考虑使用更加底层的语言来提供更加强大的能力。
与Node.js类似,鸿蒙上通过 N-API 为上层的 ArkTS 提供了调用底层 C++ 代码的能力。因此我们可以基于 C++ 开发一些原生的模块来给上层的 ArkTS 引擎提供相关的能力。
在此基础上,我们更深一步考虑使用 Rust 作为开发语言来实现 Native 模块的开发。其中在 Node.js 生态中,存在诸如 neon 、napi-rs等强大的第三方库来快速的帮助我们开发 Native 模块。
出于其设计的一致性,作者将 napi-rs 进行了迁移适配从而是的我们能够在鸿蒙中使用到完整的 napi-rs 的能力。并且基于此衍生出鸿蒙上 Rust 生态的一系列适配工具和能力。
接下来我们将从零开始使用 ohos-rs 开发一个 crc32 的 Native 模块。
起步
在开始前,我们需要准确以下两个环境以确保我们能够正常的进行模块的构建以及功能开发。
完成安装之后,我们需要进行一些初始化操作。
配置鸿蒙NDK
在完成 IDE 的安装之后,我们需要为我们的环境配置一个名为OHOS_NDK_HOME
的环境变量,该环境变量将会被 相关工具使用,以进行模块的构建。
以作者的设备为例,我们的 SDK 安装路径如下所示:
则我们的环境变量配置如下所示:
export OHOS_NDK_HOME=/Volumes/PSSD/harmony_old/openharmony/9
注意,我们的最终的环境变量效果应该如下所示:
配置 Rust 开发套件
接下来,我们需要准备一些 Rust 的初始化来确保我们可以构建运行,在此之前需要确保你已经安装好了最新版本的 Rust,其版本号应该 >= 1.78.0
。
在安装完成之后,执行如下命令:
rustup target add aarch64-unknown-linux-ohosrustup target add armv7-unknown-linux-ohosrustup target add x86_64-unknown-linux-ohos
该命令是为了给 Rust 安装其构建平台的 target 依赖。
紧接着安装 ohos-rs 的脚手架,脚手架提供了一系列工程化命令来简化我们的开发流程和降低开发成本。
cargo install ohrs
当出现如下的效果的时候,就意味着我们的初始化工作已经完成了。
接下来,我们将实现一个 crc32 的方法。
开发 crc32
初始化
现在我们可以通过刚才的脚手架工具来初始化一个基础的项目。
ohrs init crc32
这样我们就创建了一个带有最简单的add
方法的库,进入到项目并且尝试构建。
cd crc32 && ohrs build
我们可以看到执行成功之后,我们在项目下生成了dist
目录,其中有各个架构的最终依赖的动态链接库以及当前库的类型声明文件。
crc32
在 Rust 的社区中,有相当多的 crc32 包实现,现在我们可以像开发 Rust 项目一样在我们的工程中引入对应的依赖了。
[package]name = \"crc32\"version = \"0.1.0\"edition = \"2021\"See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[lib]crate-type = [\"cdylib\"][dependencies]napi-ohos = { version = \"*\" }napi-derive-ohos = { version = \"*\" }crc32fast = { version = \"1.4\" }[build-dependencies]napi-build-ohos = { version = \"*\" }[profile.release]lto = true
修改我们的src/lib.rs
文件如下所示:
use crc32fast::Hasher;use napi_derive_ohos::*;use napi_ohos::Result;#[napi]pub fn crc32(input: String, initial_state: Option) -> Result { let mut hasher = Hasher::new_with_initial(initial_state.unwrap_or(0)); hasher.update(input.as_bytes()); Ok(hasher.finalize())}
再次运行构建,我们就得到了新的动态链接库。现在我们可以在代码中尝试使用它。
这样,我们就成功的使用Rust开发了一个 crc32 工具函数给 ArkTS 调用。
尾声
通过 ohos-rs 我们简化了 Native 模块的整体开发难度和降低了开发成本,当然作者已经基于此将需求功能已经封装成完整的包供社区使用。