6

[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区-51C...

 1 year ago
source link: https://ost.51cto.com/posts/20701
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上) 原创 精华

写在开头:

  • OpenHarmony 中的 N-API组件定义了由ArkTS (JS/ETS)语言编写的代码和 native 代码(使用 C/C++ 编写)交互的方式,由 Node.js Node-API 框架扩展而来。

什么是Node.js Node-API 框架
Node.js Node-API为开发者提供了一套C/C++ API用于开发Node.js的Native扩展模块。从Node.js 8.0.0开始,Node-API以实验性特性作为Node.js本身的一部分被引入,并且从Node.js 10.0.0开始正式全面支持Node-API。

  • 本文以OpenHarmony 3.2beta3源码中的node.js三方库为例,从third_party/node/README.OpenSource中可得知3.2beta3移植的node版本为14.19.1,因此可参考的Node.js N-API链接为14.19.1版本,如下:https://nodejs.org/docs/latest-v14.x/api/n-api.html

  • 接口名方面,OpenHarmony 中的 N-API 组件提供的接口名与三方库Node.js一致,目前支持部分接口,详情见libnapi.ndk.json文件。


本篇是该系列文章的第5篇上半部分。有离北况归的地方就一定会有样例源码,本文提供了一个IDE开发的NAPI工程用来学习本篇知识点,下半部分将对源码进行解析。通过本文您将熟悉:

  • NAPI 导出类对象
  • NAPI 对象生命周期管理

往期回顾
三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI

三方库移植之NAPI开发[2]C/C++与JS的数据类型转换

三方库移植之NAPI开发[3]通过IDE开发NAPI工程

三方库移植之NAPI开发[4]异步调用:Callback&Promise

1.NAPI 类对象导出

1.1. NAPI导出类对象流程

  • 通过napi_define_class定义一个JS类

    • 它包含了与 C++ 类对应的构造函数、静态属性、方法、实例属性和方法。
  • 通过napi_wrap将 C++ 实例绑定在 JS对象中

    • 当 JS代码调用构造函数时,构造函数回调会使用napi_wrap将一个新的 C++ 实例绑定在 JS对象中,然后返回绑定的C++ 实例。
  • 通过napi_unwrap获取作为调用目标的C++ 实例

    • 当 JS调用C++ 类 的方法或属性时,会调用相应的napi_callback C++ 函数。对于实例回调,napi_unwrap获取作为调用目标的 C++ 实例 。

这里的napi_callback C++ 函数是指被 Node.js Node-API调用的C++ 函数

[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

2. NAPI 对象生命周期

  • 程序的生命周期是指程序从启动,运行到结束的整个过程。

  • NAPI 对象的生命周期代表着从对象创建到释放的整个过程,如下图所示:

    • 在ArkTS应用启动时会加载NAPI模块,而在NAPI模块加载过程中会创建一个对象A提供给应用使用,在应用退出或者主动释放A对象前,A对象必须一直保持"活跃"状态。从A对象创建到释放的整个过程也代表着A对象的生命周期。
      [触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区
  • 以下是Node-API 中关于对象生命周期的解释:

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

NAPI 环境生命周期API的内容参考链接如下:https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_environment_life_cycle_apis

3. 关于本文提供的样例工程

  • 本文提供了一个IDE开发的NAPI工程用来学习NAPI 类对象导出对象生命周期管理
  • 笔者运行环境:
    • 触觉智能 IDO-EVB3568-V1 开发板
    • OpenHarmony 3.2Beta2
    • DevEco Studio 3.1.0.100

3.1 触觉智能 IDO-EVB3568-V1 开发板

  • 触觉智能的这个rk3568开发板是笔者去年8月份网上冲浪购买的,4GB+32GB开发板 + 一块10.1英寸的MIPI屏幕 + 电源适配器 + usb调试器(搞开源鸿蒙用不上) 一共 739米 。笔者认为是性价比无敌的开源鸿蒙标准系统开发板。
[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区
[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区
[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

3.2. 样例工程运行

  • 1、样例安装运行后,触觉智能 IDO-EVB3568-V1开发板显示如下
[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

以下图片通过OpenHarmony预置的屏幕截图功能获取。截图文件放在下面这四个文件夹下
/data/service/el2/100/hmdfs/account/files/Pictures/Screenshots/
/storage/media/100/local/files/Pictures/Screenshots/
/mnt/hmdfs/100/account/device_view/local/files/Pictures/Screenshots/
/mnt/hmdfs/100/account/merge_view/files/Pictures/Screenshots/
然后通过hdc工具导出到PC端。

  • 2、再点击中间的"导出对象"后,PC端DevEco Studio工具的Log窗口查看到对应的调试信息。
    • 系统的调试信息也在Hilog窗口显示,且信息量大,不方便查看自己的调试信息,可以在log窗口设置过滤信息,让窗口只显示我们过滤关键字NapiTest的信息。
      [触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

调试信息如下:

08-05 11:09:03.413 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI 2 + 3 = 5
08-05 11:09:03.414 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(2, 3) 1
08-05 11:09:03.414 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(2, 3) 2
08-05 11:09:03.415 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(2, 3) 3
08-05 11:09:03.415 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest]Test NAPI 2+3 = 5
08-05 11:09:52.123 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI 2 + 3 = 5
08-05 11:09:52.123 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(0, 0) 1
08-05 11:09:52.123 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(0, 0) 2
08-05 11:09:52.124 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI add(0, 0) 3
08-05 11:09:52.124 1802-1802/com.example.objectwraptest I A0fefe/JsApp: [NapiTest]Test NAPI 4+5 = 0
  • 3、再在index.ets中取消下面这四行代码的注释。
    [触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

Hilog窗口打印调试信息如下:

[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区
08-05 09:03:38.156 1911-1911/com.example.objectwraptest I A0fefe/JsApp: [NapiTest] Test NAPI 2 + 3 = 5
08-05 09:03:38.157 1911-1911/com.example.objectwraptest I A0fefe/JsApp: [NapiTest]Test NAPI error{}
08-05 09:03:38.157 1911-1911/com.example.objectwraptest I A0fefe/JsApp: [NapiTest]Test NAPI hello NapiTest = undefined
  • 以上HiLog窗口打印信息中的com.example.objectwraptest是样例工程的包名,在样例应用工程AppScope\app.json5文件中定义。AppScope\app.json5中还可以定义样例应用hap的其他属性。
  • entry\src\main\module.json5中startWindowBackground字段可以查看应用开启时过渡动画的颜色,但是在指向的同级目录下具体的文件中设置
    [触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区
    • 在样例应用工程entry\src\main\resources\base\element\string.json中可以查看 应用名称
    • 样例图标修改entry\src\main\resources\base\media\icon.png,大小是114*114像素

知识点附送

  • OpenHarmony截屏命令:
# 进入sdk\版本号\toolchain输入cmd打开命令行
hdc_std shell
snapshot_display
# 截图默认保存在/data/目录下
exit
hdc_std file recv OpenHarmony设备端截图文件路径 PC端路径
[触觉智能RK3568使用体验]NAPI 类对象导出及其生命周期管理(上)-开源基础软件社区

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK