鸿蒙ArkTS调用Rust

0 阅读3分钟

最近在学习鸿蒙和Rust开发,就在网上找ArkTS调用Rust方面的文章,不过好多文章按照流程无法操作成功,决定解决问题后自己写一篇关于ArkTS调用Rust的文章,记录下过程,分享给同样需要的朋友,同时也方便自己以后查阅。

首先我们要配置鸿蒙、Rust开发环境和ohos-rs三方框架,具体安装配置流程见官方文档:

鸿蒙:developer.huawei.com/consumer/cn…

Rust:rust.p2hp.com/learn/get-s…

ohos-rs:ohos.rs/docs/basic/…

安装完成后开始代码编写了。

demo代码:gitee.com/hczhhm/hm_r…

1.首先使用鸿蒙开发工具新建一个简单的鸿蒙项目:

image.png

创建完成后在Index.ets文件内写一个简单的button按钮和事件:

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  add(){
    console.log('addStart=================');

    console.log('addEnd=================');
  }
  build() {
    RelativeContainer() {
     Column() {
       Button('add').margin({top: 50,left: '20%',right: '20%'})
       .width('60%')
       .height(50)
       .backgroundColor(Color.Blue)
       .onClick(()=>{
         this.add();
       })
     }.height('100%')
     .width('100%')
    }
    .height('100%')
    .width('100%')
  }
}

2.然后使用ohos-rs创建Rust项目,该项目可以创建在自己想放的地方,也可以创建在刚才的鸿蒙项目目录下,看需求定:

image.png

创建项目后,里面有个默认的add函数,就先使用这个函数吧,

image.png

下面在终端执行一下ohrs build命令,生成so文件和index.d.ts文件,因为第一次build需要下载依赖,所以时间会长点,请耐心等待。

image.png

执行完成后会生成一个dist目录,目录内内容如下:

image.png

这样Rust这边的工作就完成了。

3.在鸿蒙项目的entry目录下新建一个libs目录,将Rust项目中dist目录下的东西全部拷贝到libs目录下,并在libs下创建一个oh-package.json5文件,结果如下:

image.png

并对oh-package.json5进行编辑:

{
  "name": "librust_add.so",
  "version": "1.0.0",
  "description": "Rust implementation of librust_add",
  "main": "librust_add.so"
}

4.环境配置:

在entry目录下的oh-package.json5中添加依赖配置:

image.png

"librust_add.so": "file:./libs"

配置后如下:

image.png

点击安装librust_add.so:

image.png

正常情况下是可以安装成功的,如果失败,有可能是名称不匹配或者缺少了.so后缀,如果是其他问题请查看错误信息,使用AI搜索错误问题,比搜文章更有效率。

image.png

oh_modules 目录内容如截图所示,就代表添加成功了。

5.在代码中引用: 在Index.ets文件中引用so文件,并调用函数做加法运算

import {add} from "librust_add.so"
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  add(){
    console.log('addStart=================');
    let result = add(1,2);
    console.log('addResult=============:'+result);
    console.log('addEnd=================');
  }
  build() {
    RelativeContainer() {
     Column() {
       Button('add').margin({top: 50,left: '20%',right: '20%'})
       .width('60%')
       .height(50)
       .backgroundColor(Color.Blue)
       .onClick(()=>{
         this.add();
       })

     }.height('100%')
     .width('100%')
    }
    .height('100%')
    .width('100%')
  }
}

调试结果如下:

image.png

至此ArkTS调用的Rust的简单demo就完成了。如果文章中存在问题,希望大家可以指出,我们一起进步。

为了方便上传代码,我把Rust项目拷贝到鸿蒙项目目录下了,希望大家可以根据实际情况运行demo代码。

因为不是所有人都方便上github的,所以代码传到gitee了,demo地址:gitee.com/hczhhm/hm_r…