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

news2024/11/16 11:51:06

引言

在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 的形式返回。这些句柄必须保持对象“活动”,直到本地代码不再需要它们,更多详情参见链接:

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

未完待续…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java医院管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 医院管理系统的主要使用者分…

【IDEA】Redis可视化神器

在开发过程中&#xff0c;为了方便地管理 Redis 数据库&#xff0c;我们可能会使用一些数据库可视化插件。这些插件通常可以帮助你在 IDE 中直观地查看和管理 Redis 数据库&#xff0c;包括查看键值对、执行命令、监视数据库活动等。 IDEA作为IDE界的Jenkins&#xff0c;本身自…

软件项目管理 - 作业集合

软件项目管理 - 作业集合 作业一 1、项目与日常运作的主要区别有哪些&#xff1f; 项目&#xff1a;为提供一项独特产品、服务或成果所做的临时性努力 运作&#xff1a;连续不断周而复始的活动 项目是一次性的&#xff0c;日常运作是重复进行的&#xff1b; 项目是以目标为导…

Spring AOP基于动态代理的实现的 AOP

目录 代理什么是代理代理模式 静态代理动态代理JDK动态代理CGLIB动态代理Spring AOP使用的是哪种代理&#xff1f; 代理 什么是代理 生活中的代理 房产中介 &#xff1a; 房屋进行租赁时&#xff0c;卖方会把房子授权给中介&#xff0c;由中介代理带客户看房&#xff0c;商谈…

线段树例题

目录 1.Sequence 2.Peach Conference 3.Permutation Subsequence 1.Sequence 题目描述&#xff1a; Given an array a consisting of n integers, on which you are to perform m operations of two types. 1.Given two integers x,y, replace the number of index x with n…

httpsok-v1.12.0支持LB证书自动部署

&#x1f525;httpsok-v1.12.0支持LB证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻松搞…

console.log——NPM库

前期回顾 Vue3 TS 项目实战 - 后台管理系统 - 按钮权限_vue3ts后台管理-CSDN博客 目录 &#x1f6a9;不使用NPM插件的方式 第一步&#xff1a;创建log函数-源码 第二步&#xff1a;注册到window上 第三步&#xff1a;扩展Window接口 第四步&#xff1a;确保类型文件…

leetcode 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

leetcode 530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先 leetcode 530.二叉搜索树的最小绝对差 题目链接&#xff1a;https://leetcode.cn/problems/maximum-binary-tree/description/ 题目&#xff1a; 给你一个二叉搜索树的根节点 r…

【Qt】Qt定时器类QTimer

在进行窗口程序的处理过程中, 经常要周期性的执行某些操作, 或者制作一些动画效果&#xff0c;看似比较复杂的问题使用定时器就可以完美的解决这些问题&#xff0c; Qt中提供了两种定时器方式一种是使用Qt中的事件处理函数这个在后续章节会给大家做细致的讲解&#xff0c;本节主…

常用目标检测预训练模型大小及准确度比较

目标检测是计算机视觉领域中的一项重要任务&#xff0c;旨在检测和定位图像或者视频中的目标对象。当人类观看图像或视频时&#xff0c;我们可以在瞬间识别和定位感兴趣的对象。目标检测的目标是使用计算机复制这种智能。 近年来&#xff0c;目标检测网络的发展日益成熟&#…

设计模式基础——设计原则介绍

1.概述 ​ 对于面向对象软件系统的设计而言&#xff0c;如何同时提高一个软件系统的可维护性、可复用性、可拓展性是面向对象设计需要解决的核心问题之一。面向对象设计原则应运而生&#xff0c;这些原则你会在设计模式中找到它们的影子&#xff0c;也是设计模式的基础。往往判…

力扣刷题--1528. 重新排列字符串【简单】

题目描述 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 示例 1&#xff1a; 输入&#xff1a;s “codeleet”, indices [4,5,6,7,0,2,1,3] 输…

OpenMV的VisionBoard视觉识别开发板学习记录

此篇博客仅用于对VisionBoard的开发板的学习研究记录&#xff0c;没有教学内容。 一、资料来源 开发板资料链接 开发板环境搭建手册 开发板视频教程 板子的资料网站 openmv官方的网站 目录 一、资料来源二、针对 VisionBoard的目标识别和定位总结1. 目标识别功能1.1 物体检测…

大模型时代:生活将如何被重塑?

大模型时代&#xff1a;生活将如何被重塑&#xff1f; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享…

数据挖掘与机器学习——回归分析

目录 回归分析定义&#xff1a; 案例&#xff1a; 线性回归 预备知识&#xff1a; 定义&#xff1a; 一元线性回归&#xff1a; 如何找出最佳的一元线性回归模型&#xff1a; 案例&#xff1a; python实现&#xff1a; 多元线性回归 案例&#xff1a; 线性回归的优缺…

Codeforces Round 948 (Div. 2) D. XORificator(哈希)

题目 n*m(n*m<3e5)的矩阵&#xff0c; 实际为t(t<1e4)组样例&#xff0c;但保证sum n*m不超过3e5 你可以选一行把所有01翻转&#xff0c;问最多可以让多少列只有一个1&#xff0c;然后把你翻转的行输出 思路来源 其实题还挺裸的&#xff0c;教了一下潘老师&#xff0…

8D和FMEA的关系是什么?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在质量管理领域中&#xff0c;8D和FMEA是两个非常重要的工具。它们各自有着独特的作用&#xff0c;但同时又存在着紧密的联系。本文旨在深入探讨8D和FMEA之间的关系&#xff0c;以及它们如何协同工作以提高产品质量和客户满意度。 8D&#x…

【JavaEE精炼宝库】多线程(3)线程安全 | synchronized

目录 一、线程安全 1.1 经典线程不安全案例&#xff1a; 1.2 线程安全的概念&#xff1a; 1.3 线程不安全的原因&#xff1a; 1.3.1 案例刨析: 1.3.2 线程不安全的名词解释&#xff1a; 1.3.3 Java 内存模型 (JMM)&#xff1a; 1.3.4 解决线程不安全问题&#xff1a; 二…

紫光展锐前沿探索 | 满足未来6G多差异化应用场景的技术体系思考

在6G架构/系统设计中&#xff0c;紫光展锐提出了未来6G空口“一体多翼”的技术体系概念&#xff0c;即“Big-Lite Multi-RAT”。本文将详细对该技术体系展开介绍。 “一体多翼”技术体系通过 “体”&#xff08;Big RAT&#xff09;和“翼”&#xff08;Lite RAT&#xff09;的…

数据结构:树(2)【堆排序】【堆排序的时间复杂度】【topk】

一.堆排序 关于排序我们还是挺熟悉的&#xff0c;像是冒泡排序&#xff0c;快速排序等等。这里多介绍一种也挺牛的排序&#xff0c;叫做堆排序。在我的上一篇博客里我们了解到了关于堆的概念&#xff0c;堆又分为大堆和小堆。那么如果我们在进行堆排序的过程中&#xff0c;我们…