用Rust开发鸿蒙应用(ArkTS NAPI)

这篇具有很好参考价值的文章主要介绍了用Rust开发鸿蒙应用(ArkTS NAPI)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发流程

在DevEco Studio的模板工程中包含使用Native API的默认工程,使用File->New->Create Project创建Native C++模板工程。

在此基础上进行修改

删除

entry/src/main/cpp

打开

entry/build-profile.json5

删除c++ build 配置

{
  "apiType": "stageMode",
  "buildOption": {
    // "externalNativeOptions": {
    //  "path": "./src/main/rust/CMakeLists.txt",
    //  "arguments": "",
    //  "cppFlags": "",
    //  }
  },
  "targets": [
    {
      "name": "default",
      "runtimeOS": "HarmonyOS"
    },
    {
      "name": "ohosTest",
    }
  ]
}

创建rust项目

cargo new hello

修改 Cargo.toml

[package]
name = "hello"
version = "0.1.0"
edition = "2021"

[lib]
name = "hello"
crate-type = ["dylib"]

[dependencies]
oh-napi-sys = "0.1" 
ctor = "0.1"

lib.rs 添加测试代码

use std::ffi::{CString};
use std::ptr::{null_mut};
use oh_napi_sys::*;
use ctor::ctor;

extern "C" fn add(env: napi_env, info: napi_callback_info) ->napi_value{
    // 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在Native方法中的表现形式。

    let mut args:[napi_value; 2] = [null_mut();2];
    let mut argc = args.len();
    unsafe {
        napi_get_cb_info(env, info, &mut argc, args.as_mut_ptr(), null_mut(), null_mut());

        let mut valuetype0  = napi_valuetype_napi_undefined;
        napi_typeof(env, args[0], &mut valuetype0);
        let mut valuetype1  = napi_valuetype_napi_undefined;
        napi_typeof(env, args[1], &mut valuetype1);

        if (valuetype0 != napi_valuetype_napi_number) || (valuetype1 != napi_valuetype_napi_number) {
            let mut undefined: napi_value= null_mut();
            napi_get_undefined(env, &mut undefined);
            return undefined;
        }


        // 将获取的ArkTS参数转换为Native信息,此处ArkTS侧传入了两个number,这里将其转换为Native侧可以操作的double类型。
        let mut value0 = 0f64;
        napi_get_value_double(env, args[0], &mut value0);

        let mut value1 = 0f64;
        napi_get_value_double(env, args[1], &mut value1);

        // Native侧的业务逻辑,这里简单以两数相加为例。
        let native_sum = value0 + value1;


        // 此处将Native侧业务逻辑处理结果转换为ArkTS值,并返回给ArkTS。
        let mut sum = null_mut();
        napi_create_double(env, native_sum, &mut sum);

        return sum;
    }
}
type Callback = extern "C" fn(env: napi_env, info: napi_callback_info) -> napi_value;

unsafe fn new_func_descriptor(name: &'static str, f: Callback) ->napi_property_descriptor{
    let name= CString::new(name).unwrap();
    napi_property_descriptor{
        utf8name: CString::into_raw(name),
        name: null_mut(),
        method: Some(f),
        getter: None,
        setter: None,
        value: null_mut(),
        attributes: napi_property_attributes_napi_default,
        data: null_mut(),
    }
}

// 注册 module
#[ctor]
fn register_hello_module(){
    let name= CString::new( "hello").unwrap();

    let mut hello_module = napi_module{
        nm_version: 1,
        nm_flags: 0,
        nm_filename: null_mut(),
        nm_register_func: Some(init),
        nm_modname: name.as_ptr() as _,
        nm_priv: 0 as * mut _,
        reserved: [0 as * mut _;4],
    };


    unsafe {
        napi_module_register(&mut hello_module);
    }

    // Init将在exports上挂上Add/NativeCallArkTS这些Native方法,此处的exports就是开发者import之后获取到的ArkTS对象。
    unsafe extern "C" fn init(env: napi_env , exports: napi_value )-> napi_value {

        let desc =[
            new_func_descriptor("add", add),
        ];

        let count = desc.len();
        napi_define_properties(env, exports, count, desc.as_ptr());
        return exports;
    }
}


添加对应ts代码

// entry/src/main/rust/types/libhello/index.d.ts

export const add: (a: number, b: number) => number;
// entry/src/main/rust/types/libhello/oh-package.json5

{
  "name": "libhello.so",
  "types": "./index.d.ts",
  "version": "",
  "description": "Please describe the basic information."
}

配置依赖

// entry/oh-package.json5
{
  "name": "entry",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
  "dependencies": {
    "libhello.so": "file:./src/main/rust/types/libhello"
  }
}

在 rust 根目录下编译,添加ohos目标的教程可以参考 Rust交叉编译OpenHarmony应用动态库

cargo build -Zbuild-std  --release  --target aarch64-unknown-linux-ohos

将编译好的 libhello.so 拷贝至

entry/libs/arm64-v8a

修改页面 Index.ets

import testNapi from 'libhello.so'

// onClick 里添加
hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));

编译app点击hello world,日志中看到 Test NAPI 2 + 3 = 5文章来源地址https://www.toymoban.com/news/detail-768236.html

到了这里,关于用Rust开发鸿蒙应用(ArkTS NAPI)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 鸿蒙HarmonyOS实战-ArkTS语言(基本语法)

    🔎1.简介 HarmonyOS的ArkTS语言是一种基于TypeScript开发的语言,它专为HarmonyOS系统开发而设计。ArkTS语言结合了JavaScript的灵活性和TypeScript的严谨性,使得开发者能够快速、高效地开发出高质量的HarmonyOS应用程序。 ArkTS语言具有以下特点: 静态类型检查:开发者在编写代码时可以

    2024年01月18日
    浏览(38)
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言声明式UI描述

    ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 一、创建组件 根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 说明,创建组件时不需要new运算符。 1.无参数 如果组

    2024年02月08日
    浏览(64)
  • HarmonyOS/OpenHarmony应用开发-Stage模型ArkTS语言FormExtensionAbility

    FormExtensionAbility模块提供了卡片扩展相关接口。 说明 : 模块首批接口从API version 9 开始支持。模块接口仅可在Stage模型下使用。 导入模块 : import FormExtensionAbility from \\\'@ohos.app.form.FormExtensionAbility\\\'; 属性: 名称 类型 可读 可写 说明 context FormExtensionContext 是 否 FormExtensionAbility的上下

    2024年02月01日
    浏览(35)
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载

    LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了,框架会根据滚动容器可视区域按需创建组件,当组件划出可视区域外时,框架会进行组件销毁回收以降低内存占用。 一、接口描述 二、IDataSource类型说明 三、

    2024年02月11日
    浏览(29)
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制if/else条件渲染

    ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。说明:从API version 9开始,该接口支持在ArkTS卡片中使用。 一、使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句可以使用状态变量。 允许在容器组件内使

    2024年02月12日
    浏览(25)
  • HarmonyOS鸿蒙开发指南:基于ArkTS开发 音频渲染开发指导

    目录 场景介绍 音频中断 状态检查 异步操作 开发步骤

    2024年01月16日
    浏览(37)
  • HarmonyOS鸿蒙开发指南:基于ArkTS开发 音频录制开发指导

    目录 场景介绍 开发步骤 全流程场景 正常录制场景 音频录制的主要工作是捕获音频信号

    2024年01月19日
    浏览(51)
  • 鸿蒙HarmonyOS应用开发之使用Node-API实现跨语言交互开发流程

    使用Node-API实现跨语言交互,首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧 :实现C++方法的调用。代码比较简单,import一个对应的so库后,即可调用C++方法。 Native侧 :.cpp文件,实现模块的注册。需要提供注册lib库的名称,并在注册回调方法中定义接

    2024年04月26日
    浏览(34)
  • HarmonyOS鸿蒙开发指南:基于ArkTS的声明式开发范式 声明式UI开发实例 绘图与动画

    目录 绘制图形 绘制基本几何图形 绘制自定义几何图形 animateTo实现闪屏动画 页面转场动画 绘制能力主要是通过框架提供的绘制组件来支撑,支持svg标准绘制命令。 本节主要学习如何使用绘制组件,绘制详情页食物成分标签(基本几何图形)和应用Logo(自定义图形)。

    2024年01月17日
    浏览(37)
  • 【鸿蒙(HarmonyOS)】UI开发的两种范式:ArkTS、JS(以登录界面开发为例进行对比)

    之后关于HarmonyOS技术的分享,将会持续使用到以下版本 HarmonyOS:3.1/4.0 SDK:API 9 Release Node.js:v14.20.1 DevEco Studio: 3.1.0 HarmonyOS应用的UI开发依赖于 方舟开发框架(简称ArkUI) 。 根据官方介绍,ArkUI提供了UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包