OpenHarmony 入门——初识JS/ArkTS 侧的“JNI” NAPI(一)

引言

在Android中Java可以通过JNI 与C/C++ 通信,而在OpenHarmony 中前段语言目前是ETS,那么OpenHarmony中的 “JNI” 角色是什么呢?

一、NAPI概述

NAPI全称Native Application Programming Interface(最新版的文档已经改为Node-API了)属于UI框架ArkUI子系统的一部分,类似于Java中使用的 JNI机制,OpenHarmorny 中的 NAPI(由Node.js N-API 框架扩展而来) 用于通过 JS/ETS 语言编写的代码与 native 代码(C/C++ )交互。NAPI适合封装IO、CPU密集型、OS底层等能力并对外暴露JS接口,通过NAPI可以实现JS与C/C++代码互相访问。
在这里插入图片描述

  • NativeEngine——JS引擎抽象层,统一JS引擎在NAPI层的接口行为。
  • ModuleManager——管理模块,用于模块加载、模块信息缓存。
  • ScopeManager——管理NativeValue的生命周期。
  • ReferenceManager——管理NativeReference的生命周期。

因为在OpenHarmony中应用层的语言是基于TypeScript的,因此系统默认会提供响应系统能力的JS 接口,目前主要有三种:

  • JSI机制:L0~L1设备支持。
  • Channel机制:L3设备支持。
  • N-API机制:目前仅L2设备支持,后续须推广到L3~L5设备。

二、JavaScript 和TypeScript

TypeScript 是 JavaScript 的类型的超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等,是一种静态类型检查的语言,提供了类型注解,在代码编译阶段就可以检查出数据类型的错误同时扩展了JavaScript 的语法,所以任何现有的JavaScript 程序可以不加改变的在 TypeScript 下工作为了保证兼容性,TypeScript 在编译阶段需要编译器编译成纯 JavaScript 来运行。TypeScript 文件的后缀名 .ts (.ts,.tsx,.d.ts),JavaScript 文件是 .js。

ArkTS 则是在TypeScript 基础上扩展一些功能,增加一些类似语法糖和“注解”作用的

1、.ts 和.d.ts文件

.ts 文件包含实际的代码逻辑,用于编写 TypeScript 程序的实现,文件包含了变量、函数、类等 TypeScript 代码的定义和实现。在编译时.ts 文件将被转换为 JavaScript 文件,从而可以在浏览器或其他 JavaScript 运行环境中执行;而 .d.ts 文件是类型声明文件里面只有类型代码,没有具体的代码实现。它的文件名一般为[模块名].d.ts的形式,其中的d表示 declaration(声明),用于描述 JavaScript 代码在 TypeScript 中的类型信息。 从简而言之,.ts 文件是我们编写实际业务逻辑的地方,而 .d.ts 文件是用于提供类型声明的地方。比如我们有个JS文件 calc.js:

const calc = (x, y)=> x * y;
export {calc}

TypeScript 没有关于函数的任何信息,包括名称、参数类型,为了在 TypeScript 文件中使用该函数,需要在 d.ts 文件中提供其定义:

// calc.d.ts
declare function calc(a: number, b: number): number

然后就可以在 TypeScript 中使用该函数且不会出现任何编译错误。在 TypeScript 中,当我们引入第三方 JavaScript 库时,如果该库没有提供类型定义文件,我们就需要手动编写一个对应的声明文件,以便在编写 TypeScript 代码时能够正确地获得类型提示和类型检查。

declare module yourlibname {
	export function calculate(x: number, y: number): number;
}

2、关于d.ts的注意事项

以下为应用开发者提供了四个的JS接口,分为同步接口与异步接口两类,异步接口又分为回调方式与Promise。

import {AsyncCallback, Callback} from "./basic";
 
declare namespace SendFile {
  // 异步接口----回调方式
  function sendFile(deviceId: string, sourPath: Array<string>, destPath: Array<string>, fileCount: number, callback: AsyncCallback<number>);
  // 异步接口----Promise方式
  function sendFile(deviceId: string, sourPath: Array<string>, destPath: Array<string>, fileCount: number): Promise<number>;
  // 异步接口----回调方式
  function on(type: 'sendFinished' | 'receiveFinished', callback: AsyncCallback<TransResult>): void;
  // 同步接口
  function off(type: 'sendFinished' | 'receiveFinished'): void;
}
 
export default SendFile;

使用时只需要导入相关模块即可

// 同步调用
import myapp1 from "@ohos.SendFile"
var result = myapp1.off(/* 参数自填*/);
 
// 异步调用
/** call back 方式的异步调用 */
myapp1.sendFile("xxxx", sourPath, destPath, 4, function (err, ret) {
    ......
});
/** Promise 方式的异步调用 */
var  promiseObj = myapp1.sendFile("xxxx", sourPath, destPath, 4).then(data => {
    ......
}).catch(error => {
    ......
});
  • 自定义d.ts接口文件时,在应用开发工具(DevEco Studio)里需要将此文件放入Openharmony SDK所在目录中,例如在作者的本机为D:\Program\Huawei\OpenHarmony3.1\Sdk\ets\3.1.5.5\api与D:\Program\Huawei\OpenHarmony3.1\Sdk\js\3.1.5.5\api,根据应用调用者(js或ets)的不同放入不同的目录。
  • Openharmony已有d.ts接口文件,根据文件中注释里说的@since 9对应相应的导入sdk版本后,不需要另做导入d.ts。

OpenHarmony SDK中的部分声明文件存放在\ets\api\bundle下

.d.ts 本身的文件的名称直接关联的是register时的nm_module的值
interface_sdk-js API声明文件库提供了OpenHarmony 所有的JS API接口,进入api文件夹即可看到声明文件。我们要是想自定义自己的JS API接口,需要向ACE 申请一个唯一的module 名,然后注册进来copy到指定的路径下即可,理论上一个@.d.ts文件对应一个so,映射到C++的一个类,在里面注册完成映射。

三、NAPI 基础理论知识

1、基础数据类型

NAPI框架,所有参数,无论是ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,还是Function类型,都已统一封装为napi_value类型,故可如获取数据类型的参数一样获取Function类型参数。oh 中的具体实现在native_api.cpp其中基本的数据类型

  • napi_env 对应 NativeEngine 在 oh 中指 ArkComplier 中 JSNAPI 的相关上下文环境,任何 napi 数据类型和 js 数据类型的转换都需要用到它。
  • napi_value 对应 NativeValue 在 oh 中指所有 ArkComplier 可识别的 js 数据类型,它有子类 ArkNativeNumber、ArkNativeString、ArkNativeFunction 等,对应 js 中的 number、string、function 等数据类型。
typedef napi_value (*napi_callback)(napi_env env, napi_callback_info info)
  • napi_callback_info 对应 NativeCallbackInfo ,指注册 callback handle 时用来存放 js 传入参数信息的数据类型。它是一个 struct。
  • napi_property_descriptor 是用来存放单个 property 的数据类型。
  • napi_callback 对应 NativeCallback,即前面的 callback handle,native 代码将其注册为对应 js 接口的回调函数。

2、基本的转换函数

  • 将 c++ 转换成 napi 的函数: napi_create_string_utf8 等;
  • 将 napi 转换成 c++ 的函数: napi_get_value_string_utf8 等;
  • 创建编译器中的 js 对象: napi_create_function 等;
  • 回调 js 函数:napi_call_function

3、NAPI 对象生命周期

NAPI 对象的生命周期代表着从对象创建到释放的整个过程,如下图所示:
在 ArkTS 应用启动时会加载 NAPI 模块,而在 NAPI 模块加载过程中会创建一个对象 A 提供给应用使用,在应用退出或者主动释放 A 对象前,A 对象必须一直保持"活跃"状态。从 A 对象创建到释放的整个过程也代表着 A 对象的生命周期。
在这里插入图片描述
以下是 Node-API 中关于对象生命周期的解释:
当调用 Node-API 时,底层虚拟机在堆中对象的句柄可能以 napi_values 的形式返回。这些句柄必须保持对象“活动”,直到本地代码不再需要它们,更多详情参见链接:

句柄是一个标识符,是用来标识对象的。

未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI炒股:批量下载东方财富choice中的投资数据

工作任务&#xff1a;批量下载东方财富choice中的创投数据 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一个关于键盘鼠标自动化操作的Python脚本&#xff0c;具体步骤如下&#xff1a; 打开东方财富choice软件&#xff0c;软件路径为&#xff1…

企业微信hook接口协议,ipad协议http,语音转文字

语音转文字 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信msgid是int要转文字的语音消息id 请求示例 {"uuid":"a4ea6a39-4b3a-4098-a250-2a07bef57355","msgid":1063645 } 返回示例 {"data&…

开发中的常用快捷键

开发中的常用快捷键 文章目录 开发中的常用快捷键一、window11快捷键二、WebStrom 快捷键三、IDEA快捷键四、vscode快捷键五、eclipse快捷键项目备注 一、window11快捷键 快捷切屏 、来回切屏alttab 二、WebStrom 快捷键 常规快捷键和idea差不多 ttab生成vue模版 htab生成ht…

Apache Impala 4.4.0正式发布了!

历时半年多&#xff0c;Impala 4.4终于发布了&#xff01;本次更新带来了不少新功能&#xff0c;受限于篇幅&#xff0c;这里简要列举一些&#xff0c;后续文章再挑重点的进行介绍。 支持更多Iceberg表上的语句 支持对 Iceberg V2 表的 UPDATE 语句&#xff0c;用来更新已有数…

AI全自动生成视频MoneyPrinterTurbo源码

如今&#xff0c;短视频风靡全球&#xff0c;流量已然成为财富的象征。若能实现短视频的全自动生成&#xff0c;岂不是轻而易举地吸引眼球&#xff0c;进而赚取丰厚收益&#xff1f; MoneyPrinter 这一开源项目便能够自动生成短视频&#xff0c;且质量上乘&#xff0c;绝非那些…

WordPress建网站公司 建易WordPress建站

建易WordPress建网站公司是一家专业从事WordPress网站建设、网站维护、网站托管、运营推广和搜索引擎优化(SEO)等服务的公司。建易WordPress建网站公司提供多种服务&#xff0c;包括模板建站和定制网站&#xff0c;并且明码标价&#xff0c;价格透明&#xff0c;竭诚为全国各地…

安装Lubuntu24.04

Lubuntu24.04安装过程与22.04、20.04等完全一致。 记录 01 02 03 04 05 09 给出提示 10 11 12 13 特点 Lubuntu 22.04的特点主要包括以下几点&#xff1a; 轻量级且高效&#xff1a;Lubuntu作为Ubuntu的一个轻量级分支&#xff0c;专注于为低端电脑、老旧电脑或需要最大限…

2023年信息素养大赛小学组C++智能算法复赛真题

今天给大家分享2023年全国青少年信息素养大赛小学组C智能算法挑战赛复赛里面的一套真题&#xff0c;希望有助于大家了解复赛的难度及备考。 其他真题下载&#xff1a;网盘-真题-信息素养大赛

JUC框架-并发容器源码详解

文章目录 并发容器ConcurrentHashMapJDK 1.7 及之前的实现原理JDK 1.8 及之后的实现原理 CopyOnWriteArrayList & CopyOnWriteArraySet工作原理&#xff08;附源码&#xff09;特点适用场景 ConcurrentLinkedQueue数据结构入队列操作ConcurrentLinkedQueue 特性ConcurrentL…

深入分析 Android Activity (八)

文章目录 深入分析 Android Activity (八)1. Activity 的资源管理1.1 使用资源 ID1.2 动态加载资源1.3 资源的本地化1.4 使用 TypedArray 访问资源 2. Activity 的配置变更处理2.1 在 Manifest 文件中声明配置变更2.2 重写 onConfigurationChanged 方法2.3 保存和恢复实例状态 …

MySQL--InnoDB体系结构

目录 一、物理存储结构 二、表空间 1.数据表空间介绍 2.数据表空间迁移 3.共享表空间 4.临时表空间 5.undo表空间 三、InnoDB内存结构 1.innodb_buffer_pool 2.innodb_log_buffer 四、InnoDB 8.0结构图例 五、InnoDB重要参数 1.redo log刷新磁盘策略 2.刷盘方式&…

联想应用商店开发者常见问题FAQ

Phone/Pad应用常见问题 应用上传FAQ Q. 上传apk包时&#xff0c;提示“该包名已存在”如何处理&#xff1f; A&#xff1a;若应用包名出现冲突&#xff0c;请先核实该账号是否已存在该包名产品&#xff0c;若不在该账号下&#xff0c;请进行应用认领。 Q. 应用是否可以授权…

计算机网络——TCP / IP 网络模型

OSI 七层模型 七层模型是国际标准化的一个网络分层模型&#xff0c;大体结构可以分成七层。每层提供不同的功能。 图片来源 JavaGuide 但是这样七层结构比较复杂&#xff0c;不太实用&#xff0c;所以有了 TCP / IP 模型。 TCP / IP 网络模型 TCP / IP 网络模型可以看作是 O…

Overall Accuracy(OA)、Average Accuracy(AAcc)计算公式

四个重要的指标&#xff1a; True Positive&#xff08;TP&#xff09;、False Positive&#xff08;FP&#xff09;、True Negative&#xff08;TN&#xff09;和False Negative&#xff08;FN&#xff09;。 TP表示分类器预测结果为正样本&#xff0c;实际也为正样本&#xf…

第16篇:JTAG UART IP应用<三>

Q&#xff1a;如何通过HAL API函数库访问JTAG UART&#xff1f; A&#xff1a;Quartus硬件工程以及Platform Designer系统也和第一个Nios II工程--Hello_World的Quartus硬件工程一样。 Nios II软件工程对应的C程序调用HAL API函数&#xff0c;如open用于打开和创建文件&#…

感觉是通俗易懂的大模型入门(一)

最近人工智能非常火爆,大家可能经常听到AI、深度学习、大语言模型等名词。但真正能够将它们拆开来细致讲解的内容并不多。我大学就是学这个的,毕业后一直从事这个领域的工作。所以我打算今年陆续做一些这方面的科普,也借此机会复习巩固一下自己的知识体系。 今天就算是第一期,…

POLYGON - Elven Realm - Low Poly 3D Art by Synty(低多边形精灵王国)

Synty Studios™展示:POLYGON-精灵王国 精灵王国隐藏在群山之间,远离非魔法生物的控制。 精灵人以符文之花为动力,将其作为病房、电源、武器附魔和连接他们陆地之间的门户。 主要功能 -700多项独特资产 -模块化建筑系统,包括悬崖和瀑布。 -包括详细的演示场景 资产 角色(x…

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档&#xff0c;发现日更文章还是很花时间的。保证一周更新三篇文章就行啦&#xff0c;本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细&#xff0c;想进一步了解的就去看这篇文档或网上找别的资料&#…

mysql实战——mysql5.7保姆级安装教程

1、上传 上传5.7压缩包到/usr/local目录下 2、解压 cd /usr/local tar -zxvf mysql--5.7.38-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.38-linux-glibc2.12-x86_64/ mysql 3、创建mysql用户组和用户 groupadd mysql useradd -g mysql mysql 4、创建数据目录data&#xf…

如何设置远程桌面连接?

远程桌面连接是一种方便快捷的远程访问工具&#xff0c;可以帮助用户在不同地区间快速组建局域网&#xff0c;解决复杂网络环境下的远程连接问题。本文将针对使用远程桌面连接的操作步骤进行详细介绍&#xff0c;以帮助大家快速上手。 步骤一&#xff1a;下载并安装远程桌面连接…