首页 > 其他分享 >HarmonyOS实战开发:NAPI接口规范开发

HarmonyOS实战开发:NAPI接口规范开发

时间:2024-09-02 14:53:51浏览次数:13  
标签:asyncCallbackInfo 接口 JS HarmonyOS 开发 NAPI env napi

简介

NAPI(Native API)组件是一套对外接口基于Node.js N-API规范开发的原生模块扩展开发框架。

图 1 NAPI组件架构图

  • NativeEngine

    JS引擎抽象层,统一JS引擎在NAPI层的接口行为。

  • ModuleManager

    管理模块,用于模块加载、模块信息缓存。

  • ScopeManager

    管理NativeValue的生命周期。

  • ReferenceManager

    管理NativeReference的生命周期。

目录

NAPI组件源代码在/foundation/arkui/napi下,目录结构如下图所示:

foundation/arkui/napi
   ├── interfaces
   │   └── kits
   │       └── napi           # NAPI头文件目录
   ├── module_manager         # 模块管理
   ├── native_engine          # NativeEngine抽象层
   │   └── impl
   │       └── ark            # 基于Ark的NativeEngine实现
   ├── scope_manager          # 作用域管理
   └── test                   # 测试目录

使用场景

NAPI适合封装IO、CPU密集型、OS底层等能力并对外暴露JS接口,通过NAPI可以实现JS与C/C++代码互相访问。我们可以通过NAPI接口构建例如网络通信、串口访问、多媒体解码、传感器数据收集等模块。

接口说明

接口实现详见:foundation/arkui/napi

表 1 NAPI接口说明

接口分类

描述

模块注册

向模块管理注册模块信息的接口。

异常&错误处理

向JS抛出异常。

对象生命周期管理

作用域管理,用于限定某个作用域范围内的NAPI对象的生命周期。

创建JS对象

创建标准的对象类型。

C类型转NAPI类型

C到NAPI的类型转换。

NAPI类型转C类型

NAPI到C的类型转换。

获取全局实例的函数

获取全局实例。

JS值的操作

===、typeof、instanceof等操作符的NAPI接口。

JS对象的属性操作

操作对象属性函数集。

JS函数的操作

方法调用、实例创建。

对象封装

绑定JS对象的外部上下文关系。

简单异步

创建异步任务。

promise

创建promise对象的函数集。

脚本运行

运行JS代码。

开发步骤

下面以开发一个获取应用包名的JS接口为例介绍如何使用NAPI。

我们要实现的JS接口原型是:

function getAppName(): string;

以下是实现源码:

// app.cpp
#include <stdio.h>
#include <string.h>
#include "napi/native_api.h"
#include "napi/native_node_api.h"

struct AsyncCallbackInfo {
    napi_env env;
    napi_async_work asyncWork;
    napi_deferred deferred;
};

// getAppName对应的C/C++实现函数
napi_value JSGetAppName(napi_env env, napi_callback_info info) {
    napi_deferred deferred;
    napi_value promise;
    // 创建promise
    NAPI_CALL(env, napi_create_promise(env, &deferred, &promise));

    AsyncCallbackInfo* asyncCallbackInfo = new AsyncCallbackInfo {
        .env = env,
        .asyncWork = nullptr,
        .deferred = deferred,
    };

    napi_value resourceName;
    napi_create_string_latin1(env, "GetAppName", NAPI_AUTO_LENGTH, &resourceName);
    // 创建异步任务队列
    napi_create_async_work(
        env, nullptr, resourceName,
        // 异步任务的回调
        [](napi_env env, void* data) {},
        // 异步任务结束后的回调
        [](napi_env env, napi_status status, void* data) {
            AsyncCallbackInfo* asyncCallbackInfo = (AsyncCallbackInfo*)data;
            napi_value appName;
            const char* str = "com.example.helloworld";
            napi_create_string_utf8(env, str, strlen(str), &appName);
            // 触发回调
            napi_resolve_deferred(asyncCallbackInfo->env, asyncCallbackInfo->deferred, appName);
            napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
            delete asyncCallbackInfo;
        },
        (void*)asyncCallbackInfo, &asyncCallbackInfo->asyncWork);
    napi_queue_async_work(env, asyncCallbackInfo->asyncWork);
    return promise;
}

// 模块导出入口函数
static napi_value AppExport(napi_env env, napi_value exports)
{
    static napi_property_descriptor desc[] = {
        DECLARE_NAPI_FUNCTION("getAppName", JSGetAppName),
    };
    NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
    return exports;
}

// app模块描述
static napi_module appModule = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = AppExport,
    .nm_modname = "app",
    .nm_priv = ((void*)0),
    .reserved = {0}
};

// 注册模块
extern "C" __attribute__((constructor)) void AppRegister()
{
    napi_module_register(&appModule);
}

对应编译脚本的实现:

// BUILD.gn
import("//build/ohos.gni")
ohos_shared_library("app") {
  # 指定编译源文件
  sources = [
    "app.cpp",
  ]
  # 指定编译依赖
  deps = [ "//foundation/arkui/napi:ace_napi" ]
  # 指定库生成的路径
  relative_install_dir = "module"
  subsystem_name = "arkui"
  part_name = "napi"
}

应用中的JS测试代码:

import app from '@ohos.app'
export default {
  testGetAppName() {
    app.getAppName().then(function (data) {
      console.info('app name: ' + data);
    });
  }
}

标签:asyncCallbackInfo,接口,JS,HarmonyOS,开发,NAPI,env,napi
From: https://blog.csdn.net/weqwe6668/article/details/141819874

相关文章

  • 迅为电子RK3588S开发板第三章Buildroot系统功能测试
      iTOP-3588S开发板采用瑞芯微RK3588S处理器,是全新一代AloT高端应用芯片,采用8nmLP制程,搭载八核64位CPU(四核Cortex-A76+四核Cortex-A55架构),集成MaliG610MP4四核GPU,内置AI加速器NPU,算力达6Tops,支持8K视频硬件编码器和硬件解码器,提供了许多功能强大的嵌入式硬件引擎,性能更强......
  • 大一地信新生,如何从0规划学习WebGIS开发!附通关攻略
    关于学习WebGIS开发,很多GIS专业的学生,从大一开始苦恼从哪里入手?内容太多,不知道什么是重点?不了解企业实际应用情况,怕所学非所用。关于这一点,小编通过本文详细介绍一下!WebGIS(网络地理信息系统)是指工作在Web网上的GIS,是传统的GIS在网络上的延伸和发展,具有传统GIS的特点,可以实现......
  • CSS 样式化表格——WEB开发系列24
    表格在网页设计中扮演了重要角色,尤其是在展示数据和信息时。尽管HTML表格提供了结构化的数据展示,但要使其看起来既美观又实用,CSS样式化至关重要。一、典型的HTML表格在了解如何样式化表格之前,我们首先来看看一个典型的HTML表格结构。一个基本的HTML表格由 <table>、<thea......
  • 鸿蒙Next 开发App,沉浸式效果
    今天给自己开发的鸿蒙NextApp实现沉浸式效果,其实就是屏幕上边的状态栏和下边的横条区域和App界面一样的颜色。之前在知识星球分享过 expandSafeArea的方案(https://t.zsxq.com/8jkJ9),但后来在真机上发现有问题,在对App进行缩小分屏的时候,有个缩小动画,发现其实底部还是默认色-......
  • JSP建筑材料管理系统s0407程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景与意义随着建筑行业的......
  • JSP驾校管理平台9ar34(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:学员,教练,驾校项目,报名信息,驾校车辆,练车预约,教学培训,成绩信息,缴费信息开题报告内容一、项目背景随着汽车保有量的不断增加,驾驶培训已成为社会......
  • Linux驱动开发基础(DS18B20温度模块)
    所学来自百问网目录1.DS18B20简介2.硬件设计3.软件设计3.1 存储器介绍3.2 通信时序3.2.1初始化时序3.2.2写时序3.2.3 读时序3.3常用命令4.示例代码4.1驱动代码4.2应用代码4.3Makefile4.4实验效果1.DS18B20简介DS18B20温度传感器具有线路简单......
  • Linux驱动开发基础(IRDA 红外遥控模块)
    所学来自百问网 目录1.红外遥控简介2.硬件设计3.软件设计4.示例代码4.1驱动代码4.2Makefile4.3实验效果1.红外遥控简介红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中,像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和接收......
  • 六,Spring Boot 容器中 Lombok 插件的详细使用,简化配置,提高开发效率
    六,SpringBoot容器中Lombok插件的详细使用,简化配置,提高开发效率@目录六,SpringBoot容器中Lombok插件的详细使用,简化配置,提高开发效率1.Lombok介绍2.Lombok常用注解[email protected]@[email protected]@AllArgsConstructor2.5@NoArgsConstructor3.在idea中安装......
  • .NET 8.0 前后分离快速开发框架
    前言大家好,推荐一个.NET8.0为核心,结合前端Vue框架,实现了前后端完全分离的设计理念。它不仅提供了强大的基础功能支持,如权限管理、代码生成器等,还通过采用主流技术和最佳实践,显著降低了开发难度,加快了项目交付速度。如果你需要一个高效的开发解决方案,本框架能帮助大家轻松应......