觸覺智能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 對象生命周期管理
1、NAPI 類對象導出
OpenHarmony NAPI提供了一種“包裝”C ++類和實例的方法,以便JS應用可以調用類的構造函數和方法。
Node.js Node-API中關于導出類對象的內容,參考鏈接 : https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_object_wrap
(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++ 函數。
2、NAPI 對象生命周期
程序的生命周期是指程序從啟動,運行到結束的整個過程。
NAPI 對象的生命周期代表著從對象創建到釋放的整個過程,如下圖所示:
在ArkTS應用啟動時會加載NAPI模塊,而在NAPI模塊加載過程中會創建一個對象A提供給應用使用,在應用退出或者主動釋放A對象前,A對象必須一直保持"活躍"狀態。從A對象創建到釋放的整個過程也代表著A對象的生命周期。
以下是Node-API 中關于對象生命周期的解釋:
當調用Node-API時,底層虛擬機在堆中對象的句柄可能以napi_values的形式返回。這些句柄必須保持對象“活動”,直到本地代碼不再需要它們。參考鏈接:https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_object_lifetime_management
句柄是一個標識符,是用來標識對象的。
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
(1)觸覺智能 IDO-EVB3568-V1 開發板
觸覺智能的這個rk3568開發板是筆者去年8月份網上沖浪購買的,4GB+32GB開發板 + 一塊10.1英寸的MIPI屏幕 + 電源適配器 + usb調試器(搞開源鴻蒙用不上) 一共 739米 。筆者認為是性價比無敵的開源鴻蒙標準系統開發板。
觸覺智能一直在給 IDO-EVB3568-V1 開發板適配最新的OpenHarmony版本。例如2月1號發布Beta5,作為消費者的筆者立馬收到了適配了IDO-EVB3568-V1的Beta5鏡像包,有MIPI版本的和HDMI版本。購買后的體驗是非常不錯的。購買鏈接如下:https://item.taobao.com/item.htm?spm=4645b.1.14.1.5c4a4a7dv1soeZ&id=658789039056&ns=1&abbucket=5#detail。
(2)樣例工程運行
1、樣例安裝運行后,觸覺智能 IDO-EVB3568-V1開發板顯示如下:
以下圖片通過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的信息。
調試信息如下:
3、再在index.ets中取消下面這四行代碼的注釋。
Hilog窗口打印調試信息如下:
以上HiLog窗口打印信息中的com.example.objectwraptest是樣例工程的包名,在樣例應用工程AppScope\app.json5文件中定義。AppScope\app.json5中還可以定義樣例應用hap的其他屬性。
entry\src\main\module.json5中startWindowBackground字段可以查看應用開啟時過渡動畫的顏色,但是在指向的同級目錄下具體的文件中設置。
在樣例應用工程entry\src\main\resources\base\element\string.json中可以查看 應用名稱
樣例圖標修改entry\src\main\resources\base\media\icon.png,大小是114*114像素
知識點附送
OpenHarmony截屏命令:
文章相關附件可以點擊下面的原文鏈接前往下載
https://ost.51cto.com/resource/2513