赞
踩
本文用于指导以Rust作为应用开发语言进行鸿蒙应用开发以及 OpenHarmony 对于Rust语言的支持说明
本指导适用以下范围:
开发者在进行鸿蒙应用开发时,希望用 Rust 构建部分应用模块以获得应用在运行性能、安全等方面的提升,或者开发者希望将三方 Rust 模块进行鸿蒙化。
虽然Rust主线版本已经支持 OpenHarmony,但当前Rust对于 OpenHarmony 为 tier3 支持,无法使用 rustup 下载到 OpenHarmony 对应的 std 标准库。所以推荐使用 rust nightly 版本-Z build-std
实时构建std标准库,此方式会默认将 OpenHarmony 的 std 和 Rust 模块静态链接。后续也将会升级为 Tier2 支持。
使用Rust开发鸿蒙应用
目前OpenHarmony 对应用只开放了ArkTS API 和 C API(NDK), 没有 Rust API。
应用使用 Rust 开发的程序,通常使用 Rust 语言实现,并导出 C 函数接口,最终编译成一个 C动态链接库,即 Rust 中的cdylib。在系统看来这个Rust语言编写的 动态库和 C/C++ 实现的动态库没有区别。
应用使用 Rust 语言的依赖限制和使用 C/C++ 语言开发也很类似,即最终只可以依赖包括 libc 在在内的 NDK 库的范围。 例如 Rust 程序可以直接通过 nix crate 和 libc crate 访问 C库中的 posix 接口, 但是不能通过 openssl-sys crates 访问到系统中的 openssl, 和 C/C++ 代码一样, 需要自行交叉编译 openssl 和应用一起部署。
基于当前Rust社区对OpenHarmony 的支持和IDE开发现状,提供一个使用Rust官方工具链编译生成可以在 OpenHarmony 运行程序的简单示例,Rust编译平台为 linux 系统,应用开发平台为 Windows 版本 DevEco Studio。
下载Rust工具链和std源码
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
rustup toolchain install nightly
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
您可以从OpenHarmony社区下载站点获取最新的release版本(当前为4.0-Release)的Public SDK包
# 下载SDK包
wget https://repo.huaweicloud.com/openharmony/os/4.0-Release/ohos-sdk-windows_linux-public.tar.gz
# 解压SDK包
tar -xvzf ohos-sdk-windows_linux-public.tar.gz
# 解压ndk压缩包
cd /path/to/ohos-sdk/linux
unzip native-linux-*
创建 aarch64-unknown-linux-ohos-clang.sh,并编辑文件内容为(注意:需修改文件中的路径信息!):
#!/bin/sh
exec /path/to/ohos-sdk/linux/native/llvm/bin/clang \
-target aarch64-linux-ohos \
--sysroot=/path/to/ohos-sdk/linux/native/sysroot \
-D__MUSL__ \
"$@"
编辑~/.cargo/config
[target.aarch64-unknown-linux-ohos]
ar = "/path/to/ohos-sdk/linux/native/llvm/bin/llvm-ar"
linker = "/path/to/aarch64-unknown-linux-ohos-clang.sh"
cargo init --lib mylib
该项目会自动创建一个src/lib.rs
文件,该文件中定义了一个add()
函数,为了能够支持FFI跨语言调用,我们对其做如下修改:
// add is a function
#[no_mangle]
pub extern "C" fn rust_add(left: usize, right: usize) -> usize {
left + right
}
在Cargo工程配置文件Cargo.toml中修改[lib]
字段
[lib]
crate-type=["cdylib"]
使用下面命令生成debug版本,如需生成release版本,在命令行中添加--release
选项
cargo +nightly build -Z build-std --target aarch64-unknown-linux-ohos
至此我们使用Rust语言开发了一个可以运行在 OpenHarmony 上的动态库,现在可以在 App 工程的Cmake文件中引用这个生成的so文件
我们将Rust接口函数通过FFI转换为对应C接口调用。并进一步将该接口注册到NAPI中。
entry/libs/arm64-v8a
目录下(没有该目录,就手动创建)externalNativeOptions
字段添加对于abi的过滤,只编译一种arm64-v8a一种目标架构。"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "",
"cppFlags": "",
"abiFilters": [
"arm64-v8a"
]
}
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(MyApplication11)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)
add_library(entry SHARED hello.cpp)
target_link_libraries(entry PUBLIC libace_napi.z.so ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libmylib.so)
rust_add()
函数声明和函数调用。#include "napi/native_api.h"
extern "C" {
unsigned rust_add(unsigned left, unsigned right);
}
...
// napi_create_double(env, value0 + value1, &sum);
napi_create_double(env, rust_add(value0, value1), &sum)
...
接入真机设备或模拟器,打开应用并点击页面中的 Hello World
字符,在IDE的 Log 选项卡查看到字样:"Test NAPI 2+3 =5"
完成测试。
当前的DevEco Studio并不直接支持Rust开发、编译、调试,但是可以通过安装三方插件和调试工具,调用三方rust库来实现rust的集成开发和arkts与rust的交互。下面是一个在IDE中开发rust代码的例子(windows):
下载得到一个zip格式的压缩包,在IDE中可以通过从磁盘手动安装该插件
截止 2024/4/1,Rust已经在nightly版本对OpenHarmony达成tier2支持。不再需要使用-Zbuild-std选项。
假设文件位于C:\Users\{username}\.cargo\aarch64-unknown-linux-ohos-clang.cmd
:
C:\Users\{username}\AppData\Local\OpenHarmony\Sdk\10\native\llvm\bin\clang.exe ^
-target aarch64-linux-ohos ^
--sysroot=C:\Users\{username}\AppData\Local\OpenHarmony\Sdk\10\native\sysroot ^
-D__MUSL__ %*
编辑C:\Users\{username}\.cargo\config.toml
,新增下面内容(注意路径使用“/”
):
[target.aarch64-unknown-linux-ohos]
ar = "C:/Users/{username}/AppData/Local/OpenHarmony/Sdk/10/native/llvm/bin/llvm-ar.exe"
linker = "C:/Users/{username}/.cargo/aarch64-unknown-linux-ohos-clang.cmd"
[profile.debug]
opt-level=0
debug = true
debug-assertions = true
cargo new mylib --lib
Cargo.toml
中增加下面内容:[lib]
crate-type = ["cdylib"]
[dependencies]
napi-ohos = { version = "*" }
napi-derive-ohos = { version = "*" }
[build-dependencies]
cc = "1.0"
napi-build-ohos = { version = "*" }
use napi_build_ohos;
fn main() {
napi_build_ohos::setup();
}
src/lib.rs
内容为:use napi_derive_ohos::napi;
#[napi]
pub fn rust_add(left: u32, right: u32) -> u32 {
left + right
}
cargo build --target=aarch64-unknown-linux-ohos
将我们编译好的libmylib.so放置到entry/libs/arm64-v8a
目录下(没有该目录,就手动创建)
在entry\src\main\cpp\types\libentry\index.d.ts
新增Rust的映射接口:
export const rustAdd: (a: number, b: number) => number;
entry\src\main\ets\pages\Index.ets
文件中导入该动态库:import rustlib from 'libmylib.so'
...
hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', rustlib.rustAdd(2, 3));
...
接入真机设备或模拟器,打开应用并点击页面中的 Hello World
字符,在IDE的 Log 选项卡查看到字样:"Test NAPI 2+3 =5"
完成测试。
安装Rust插件和debugger插件后,可以在IDE中直接运行和调试Rust代码, 并支持ArkTS和rust的跨语言调试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。