OpenHarmony4.1上初体验rust
前言
由于后续可能要做rust基于OpenHarmony的开发工作,于是先开始一些调研性的工作,rust了解的内容可以参考该文章:
ubuntu20.04搭建RUST开发环境并与C语言交互
一、准备工作
OpenHarnmony4.1版本,有设备的话可以用riscv的荔枝派,rk3568的dayu系列开发板,没有设备的话可以用QEMU。
本文以下的尝试均基于riscv的OpenHarnmony4.1版本在荔枝派上进行。
整编OH版本并烧录至荔枝派设备,确保可以正常启动桌面。
二、初步调研
rust相关的目录主要有以下几个:
- build\rust:有一些rust相关的测试demo,比如和c、c++代码进行互调的测试等,可以使用以下命令进行编译,其中build-target可以使用build\rust\tests\BUILD.gn中的group。
./build.sh --product-name rvbook --no-prebuilt-sdk --build-target ohos_rust_xxxtest_tests
./build.sh --product-name rvbook --no-prebuilt-sdk --build-target cargo_crate_test
./build.sh --product-name rvbook --no-prebuilt-sdk --build-target cxx_test_host_and_target
- third_party\rust\crates 里面东西很多,需要慢慢看。
- build\templates\rust
- prebuilts\rustc-riscv
- 其他的发现以后再进行补充。
三、初步尝试
运行测试demo
使用上面的编译命令将相关的demo编译出后通过HDC命令将相关的进程和库文件拷贝至荔枝派设备的“/data”目录。
其中编译ohos_rust_xxxtest_tests目标时会有如下报错:

应该是编译器限制的比较严格,不能有warning导致,如下修改代码即可
build\rust\tests\test_proc_macro_crate\test_derive_macro\src\main.rs
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
extern crate derive_macro;
use derive_macro::AnswerFn;
#[derive(AnswerFn)]
#[allow(dead_code)] //新增此行
struct Struct;
fn main() {
assert_eq!(42, answer());
}
生成的相关二进制位于out/build/build_framework/

在荔枝派上./运行,除了一个需要设置一下环境变量,其他都可以正常跑出结果。
export LD_LIBRARY_PATH=/data/build_framework
四、尝试构建自己的hello world
就在build/rust目录下开始编写自己的hello world。
- 新建目录,目录下新增main.rs,build.rs,BUILD.gn。
main.rs就只有一个println!,build.rs从test的其他demo直接拿过来用,BUILD.gn也可以仿照其他的demo。 - 修改build目录下的bundle.json,增加新的build-target。运行编译命令(其中rust_liusai为我新添加到bundle.json的group):
./build.sh --product-name rvbook --no-prebuilt-sdk --build-target rust_liusai

原因是"-D missing-docs",找一下解决方法。
删除build/templates/rust/rust_target_lints.gni 和 build/templates/rust/rust_template.gni中的编译配置选项
rustcOhosLints = [
“-A”,
“deprecated”,
“-D”, //删除
“missing-docs”, //删除
“-D”,
“warnings”,
]
或者把编译命令中的"-D missing-docs"直接删除,然后cd到目录out/rvbook编译,成功得到进程文件。HDC到设备上./运行:

成功。
五、与C、C++的交互
参考OH自带的文档
third_party\rust\crates\cxx\readme_zh.md
third_party\rust\crates\bindgen\readme_zh.md
docs\zh-cn\device-dev\subsystems\subsys-build-rust-compilation.md
明天搞出来以后进行补充。–先割两天,去搞一搞蓝牙模块。
开搞,更新到了5.0版本。之前还测试过4.0的版本,编译测试demo的时候有点问题,查了一下是在架构适配的时候出错,稍微修改BUILD.gn中调用rust工具链的路径即可。
看了下上面的readme,里面描述了bindgen实现Rust调用C,Rust和C++之间的安全FFI。
bindgen实现Rust调用C
在上面hello world的基础上按照bindgen\readme_zh.md中的步骤实现即可,代码就不贴了,有点多,感兴趣的同学可以去文末找下载链接,其中删除了一些没必要的头文件引用。
- 创建libc.h,libc.c并添加库代码。
- 修改mian.rs,调用C库接口。
- 修改BUILD.gn,添加ohos_shared_library,rust_bindgen,ohos_rust_executable。
- 编译、烧录、测试即可。
C++调用Rust接口
同上,继续在上面的工程里实现,按照cxx\readme_zh.md,其中修复了文档中部分过时的内容(cxx_rustdeps,cxx_cppdeps)。
- 创建lib.rs并编写rust库接口。
- 创建main.cpp,引用lib.rs并调用其中接口。
- 修改BUILD.gn,添加rust_cxx,ohos_rust_static_ffi,ohos_executable。
- 编译、烧录、测试即可。
Rust调用C++接口
注意,这里不能在之前的工程里继续添加代码。
直接参考test_cxx_rust,使用下面的命令编译,生成进程test_cxx_rust运行测试即可。
./build.sh --product-name rvbook --no-prebuilt-sdk --build-target cxx_test_host_and_target
总结
bindgen主要用来实现rust代码对c接口的单向调用;CXX工具可以实现rust和C++的互相调用。
需要了解OpenHarmony,HDC,ninja编译体系构建。
熟悉rust语言,rust编译。
附
代码资源链接如下
《OpenHarmony4.1上初体验rust》 文章代码

271

被折叠的 条评论
为什么被折叠?



