觸覺(jué)智能RK3568使用體驗(yàn)—NAPI 類對(duì)象導(dǎo)出及其生命周期管理(上)
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
寫在開(kāi)頭:
OpenHarmony 中的 N-API組件定義了由ArkTS (JS/ETS)語(yǔ)言編寫的代碼和 native 代碼(使用 C/C++ 編寫)交互的方式,由 Node.js Node-API 框架擴(kuò)展而來(lái)。
什么是Node.js Node-API 框架
Node.js Node-API為開(kāi)發(fā)者提供了一套C/C++ API用于開(kāi)發(fā)Node.js的Native擴(kuò)展模塊。從Node.js 8.0.0開(kāi)始,Node-API以實(shí)驗(yàn)性特性作為Node.js本身的一部分被引入,并且從Node.js 10.0.0開(kāi)始正式全面支持Node-API。
本文以O(shè)penHarmony 3.2beta3源碼中的node.js三方庫(kù)為例,從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 組件提供的接口名與三方庫(kù)Node.js一致,目前支持部分接口,詳情見(jiàn)??libnapi.ndk.json??文件。
本篇是該系列文章的第5篇上半部分。有離北況歸的地方就一定會(huì)有樣例源碼,本文提供了一個(gè)IDE開(kāi)發(fā)的NAPI工程用來(lái)學(xué)習(xí)本篇知識(shí)點(diǎn),下半部分將對(duì)源碼進(jìn)行解析。通過(guò)本文您將熟悉:
- NAPI 導(dǎo)出類對(duì)象
- NAPI 對(duì)象生命周期管理
1、NAPI 類對(duì)象導(dǎo)出
OpenHarmony NAPI提供了一種“包裝”C ++類和實(shí)例的方法,以便JS應(yīng)用可以調(diào)用類的構(gòu)造函數(shù)和方法。
Node.js Node-API中關(guān)于導(dǎo)出類對(duì)象的內(nèi)容,參考鏈接 : https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_object_wrap
(1)NAPI導(dǎo)出類對(duì)象流程
通過(guò)napi_define_class定義一個(gè)JS類。
- 它包含了與 C++ 類對(duì)應(yīng)的構(gòu)造函數(shù)、靜態(tài)屬性、方法、實(shí)例屬性和方法。
通過(guò)napi_wrap將 C++ 實(shí)例綁定在 JS對(duì)象中。
- 當(dāng) JS代碼調(diào)用構(gòu)造函數(shù)時(shí),構(gòu)造函數(shù)回調(diào)會(huì)使用napi_wrap將一個(gè)新的 C++ 實(shí)例綁定在 JS對(duì)象中,然后返回綁定的C++ 實(shí)例。
通過(guò)napi_unwrap獲取作為調(diào)用目標(biāo)的C++ 實(shí)例。
- 當(dāng) JS調(diào)用C++ 類 的方法或?qū)傩詴r(shí),會(huì)調(diào)用相應(yīng)的napi_callback C++ 函數(shù)。對(duì)于實(shí)例回調(diào),napi_unwrap獲取作為調(diào)用目標(biāo)的 C++ 實(shí)例 。
這里的napi_callback C++ 函數(shù)是指被 Node.js Node-API調(diào)用的C++ 函數(shù)。
2、NAPI 對(duì)象生命周期
程序的生命周期是指程序從啟動(dòng),運(yùn)行到結(jié)束的整個(gè)過(guò)程。
NAPI 對(duì)象的生命周期代表著從對(duì)象創(chuàng)建到釋放的整個(gè)過(guò)程,如下圖所示:
在ArkTS應(yīng)用啟動(dòng)時(shí)會(huì)加載NAPI模塊,而在NAPI模塊加載過(guò)程中會(huì)創(chuàng)建一個(gè)對(duì)象A提供給應(yīng)用使用,在應(yīng)用退出或者主動(dòng)釋放A對(duì)象前,A對(duì)象必須一直保持"活躍"狀態(tài)。從A對(duì)象創(chuàng)建到釋放的整個(gè)過(guò)程也代表著A對(duì)象的生命周期。
以下是Node-API 中關(guān)于對(duì)象生命周期的解釋:
當(dāng)調(diào)用Node-API時(shí),底層虛擬機(jī)在堆中對(duì)象的句柄可能以napi_values的形式返回。這些句柄必須保持對(duì)象“活動(dòng)”,直到本地代碼不再需要它們。參考鏈接:https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_object_lifetime_management
句柄是一個(gè)標(biāo)識(shí)符,是用來(lái)標(biāo)識(shí)對(duì)象的。
NAPI 環(huán)境生命周期API的內(nèi)容參考鏈接如下:https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_environment_life_cycle_apis
3、關(guān)于本文提供的樣例工程
本文提供了一個(gè)IDE開(kāi)發(fā)的NAPI工程用來(lái)學(xué)習(xí)NAPI 類對(duì)象導(dǎo)出和對(duì)象生命周期管理。
筆者運(yùn)行環(huán)境:
- 觸覺(jué)智能 IDO-EVB3568-V1 開(kāi)發(fā)板
- OpenHarmony 3.2Beta2
- DevEco Studio 3.1.0.100
(1)觸覺(jué)智能 IDO-EVB3568-V1 開(kāi)發(fā)板
觸覺(jué)智能的這個(gè)rk3568開(kāi)發(fā)板是筆者去年8月份網(wǎng)上沖浪購(gòu)買的,4GB+32GB開(kāi)發(fā)板 + 一塊10.1英寸的MIPI屏幕 + 電源適配器 + usb調(diào)試器(搞開(kāi)源鴻蒙用不上) 一共 739米 。筆者認(rèn)為是性價(jià)比無(wú)敵的開(kāi)源鴻蒙標(biāo)準(zhǔn)系統(tǒng)開(kāi)發(fā)板。
觸覺(jué)智能一直在給 IDO-EVB3568-V1 開(kāi)發(fā)板適配最新的OpenHarmony版本。例如2月1號(hào)發(fā)布Beta5,作為消費(fèi)者的筆者立馬收到了適配了IDO-EVB3568-V1的Beta5鏡像包,有MIPI版本的和HDMI版本。購(gòu)買后的體驗(yàn)是非常不錯(cuò)的。購(gòu)買鏈接如下:https://item.taobao.com/item.htm?spm=4645b.1.14.1.5c4a4a7dv1soeZ&id=658789039056&ns=1&abbucket=5#detail。
(2)樣例工程運(yùn)行
1、樣例安裝運(yùn)行后,觸覺(jué)智能 IDO-EVB3568-V1開(kāi)發(fā)板顯示如下:
以下圖片通過(guò)OpenHarmony預(yù)置的屏幕截圖功能獲取。截圖文件放在下面這四個(gè)文件夾下:
/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/
然后通過(guò)hdc工具導(dǎo)出到PC端。
2、再點(diǎn)擊中間的"導(dǎo)出對(duì)象"后,PC端DevEco Studio工具的Log窗口查看到對(duì)應(yīng)的調(diào)試信息。
系統(tǒng)的調(diào)試信息也在Hilog窗口顯示,且信息量大,不方便查看自己的調(diào)試信息,可以在log窗口設(shè)置過(guò)濾信息,讓窗口只顯示我們過(guò)濾關(guān)鍵字NapiTest的信息。
調(diào)試信息如下:
3、再在index.ets中取消下面這四行代碼的注釋。
Hilog窗口打印調(diào)試信息如下:
以上HiLog窗口打印信息中的com.example.objectwraptest是樣例工程的包名,在樣例應(yīng)用工程AppScope\app.json5文件中定義。AppScope\app.json5中還可以定義樣例應(yīng)用hap的其他屬性。
entry\src\main\module.json5中startWindowBackground字段可以查看應(yīng)用開(kāi)啟時(shí)過(guò)渡動(dòng)畫的顏色,但是在指向的同級(jí)目錄下具體的文件中設(shè)置。
在樣例應(yīng)用工程entry\src\main\resources\base\element\string.json中可以查看 應(yīng)用名稱
樣例圖標(biāo)修改entry\src\main\resources\base\media\icon.png,大小是114*114像素
知識(shí)點(diǎn)附送
OpenHarmony截屏命令:
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載
https://ost.51cto.com/resource/2513
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??