在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

教程分享!OpenHarmony之NAPI框架介紹

電子發燒友開源社區 ? 來源:未知 ? 2023-11-30 12:15 ? 次閱讀

NAPI 是什么

NAPI 的概念源自 Nodejs,為了實現 javascript 腳本與 C++庫之間的相互調用,Nodejs 對 V8 引擎的 api 做了一層封裝,稱為 NAPI。可以在 Nodejs 官網(https://nodejs.org/dist/latest-v20.x/docs/api/n-api.html)上查看各種 NAPI 接口定義說明。

wKgaomVoDXaAEIhiAACKsNK2uTI532.png

可以看到,NAPI 接口本身是 C++語言實現的,這些接口可以幫助 C++代碼創建 JS 變量,或訪問 JavaScript 運行環境中的 JS 變量與方法。

OpenHarmony 中的 NAPI

OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)應用層基于 javascript 語言開發,而系統框架層則基于 C++語言。它們之間需要一個橋梁來實現兩種語言代碼之間的相互調用,這個橋梁就是 NAPI。

wKgaomVoDXaAIg1bAAATeJfNdak212.png

這里可能有的小伙伴有疑問了:OpenHarmony 的 NAPI 和 NodeJs 的 NAPI 是一回事嗎?

應該說,OpenHarmony 系統沿用了 NAPI 的接口定義形式,但每個接口的內部實現都進行了重寫。這是因為 NAPI 接口的本質是幫助 C++程序去跟 Javascript 引擎交互,因此對于不同的引擎需要有不同的實現方式。

當用戶調用了 NAPI 接口 napi_create_int64(), 對于 Nodejs 而言,它會去訪問 V8 引擎的 api 創建一個 js 的數字變量,而對于 OpenHarmony,則是去訪問 ArkUI 框架自己的 js 引擎(ArkNativeEngine)。在 OpenHarmony 源碼中搜索 napi_create_int64() 方法,你會得到一份頭文件定義:third_party odesrcjs_native_api.h

以及兩份不同的實現代碼:

third_party
odesrcjs_native_api_v8.cc
foundationarkui
api
ative_engine
ative_api.cpp

(左右移動查看全部內容)

native_api.cpp 是 OpenHarmony 版本的 NAPI 實現,想了解內部細節的可以從這里入手:

wKgaomVoDXaAHg5vAACfZ672Y9U740.png

創建一個簡單的 NAPI 工程

可以通過 DevEco Studio 的 Native C++模板創建一個包含簡單 NAPI 實現的樣例工程。

wKgaomVoDXaAD7m5AAA4g0WWTpI528.png

該工程自帶一個 hello.cpp,實現了一個能夠被 javascript 代碼調用的 add()方法。

wKgaomVoDXeAZ_oNAAExaOIHWkE937.png

下面我們就基于這個簡單的例子,探究一下 NAPI 框架的實現原理。

應用如何調用 NAPI 接口

應用代碼導入對應的 so 庫后,就可以調用該庫實現的接口。

wKgaomVoDXeAQpUIAAChsVRRkG0548.png

這里我們注意到,導入日志庫時使用的名稱是"@ohos.hilog",應用代碼如果寫成 import hilog from 'libhilog.z.so' 其實也是可以成功導入的。

實際上,ArkUI 在運行時會將 @ohos.hilog 轉換為 libhilog.z.so,然后到 /system/lib/module/ 目錄下查找此庫并加載。

系統實現的 NAPI 庫都放在/system/lib/module/目錄下,類似的:

  • @ohos.wifiManager 對應的是 /system/lib/module/libwifimanager.z.so;

  • @ohos.deviceInfo 對應的是 /system/lib//module/libdeviceinfo.z.so

除了系統自帶的 NAPI 庫,應用也可以用 C++開發自己的 NAPI 庫。上面例子中 import testNapi from 'libentry.so' 導入的就是應用自己實現的。應用開發的 NAPI 庫會隨著應用工程一起編譯打包到 hap 文件中,最終部署到/data 目錄每個應用自己的文件夾下。

wKgaomVoDXeALQgHAAEoRfL6EPs348.png

NAPI 庫的導入原理

我們知道,應用的 javascript 代碼是由 ArkUI 的 JS 引擎解釋執行的。當 JS 引擎解讀 import hilog from '@ohos.hilog'; 這行代碼時,會通過 dlopen() 將對應的 libhilog.z.so 加載到應用進程中。這一切是怎么做到的呢?

每個應用進程在初始化時,都會創建一個引擎實例 ArkNativeEngineImpl,我們來看一下它的構造函數

foundationarkui
api
ative_engineimplarkark_native_engine_impl.cpp

(左右移動查看全部內容)

wKgaomVoDXeAMAK5AADrkyFWTa4032.png

也就是說,每個應用進程的 JS 引擎中,都注冊了一個"requireNapi"函數,當應用調用此方法時,JS 引擎就會通過 NAPI 框架的 moduleManager 類去處理 so 庫的加載。moduleManager 內部最終是找到了/system/lib/module 下對應的 so 文件,并通過 dlopen()的方式加載到應用進程中。想了解細節的小伙伴可以讀一下 NativeModuleManager::LoadNativeModule()方法的內部實現。

這里可能會有個疑問:應用的 javascript 代碼中并沒有寫什么"requireNapi"的代碼,只有 import xxx,怎么觸發的導入處理函數?答案要到編譯后的 js 代碼中尋找。我們解開編譯后的 hap 包,找到 ets 文件對應的 js 文件:

wKgaomVoDXeAeAuGAACFo3COaqI892.png

可以看到,index.ets 被編譯成 index.js 后,import 關鍵字也被轉為了"requireNapi",這樣 JS 引擎在執行這行代碼時,就會去調用注冊的導入處理函數了。

wKgaomVoDXeAcE1wAACFc38EnB8472.png

C++庫如何實現 JS 方法

前面解決了 JS 導 C++庫的問題,下一步就是 JS 如何調用 C++庫里的方法了。先說結論:一個 C++方法能否被應用調用,取決與 C++代碼有沒有將這個方法注冊到 JS 引擎。

我們來看看 hello.cpp 是如何注冊 add 方法的:

wKgaomVoDXiAJSkWAAE4E8ZHYPc725.png

我們可以從下往上看這段代碼:首先是 RegisterEntryModule(void) 方法。這是 C++向 JS 引擎進行 NAPI 模塊與方法注冊的起始代碼。注意這個方法前面有個編譯修飾符 "attribute((constructor))",它的作用是指導 C++代碼的編譯,使得當 so 庫被加載到應用進程中時,RegisterEntryModule(void) 方法就會被自動調用到。該方法通過 NAPI 接口 napi_module_register() 向 JS 引擎注冊了一個 napi_module。

然后是 Init()方法。該方法實現了 Add 方法的注冊。也就是告訴 JS 引擎,將 JS 符號"add" 與 C++方法"Add" 進行關聯映射。這樣后續當 JS 引擎解釋執行 javascript 代碼 "testNapi.add(2, 3)"時,就會找到 C++ Add()方法的函數地址并調用。如下圖所示:

wKgaomVoDXiAfWNYAAM0UOoVFnQ341.png

方法關聯調用的問題也解決了,最后就是 JS 運行環境與 C++運行環境的相互切換了。當 C++的 Add 方法被 JS 引擎調用到后,引擎會將 javascript 下發的參數變量傳遞給 C++。所有從 JS 運行環境傳遞過來的變量都是用 napi_value 類型來表示的。需要通過 NAPI 接口轉為 C++語言的變量類型。詳見下圖每行代碼的注釋:

wKgaomVoDXiAcCHPAAMw9le05dg911.png

napi_value 不是一個具體的類型,它類似于 void*,表示的是 JS 變量在 JS 引擎內部存儲區內的地址。需要通過對應的 NAPI 方法實現,例如:napi_get_value_int32() --- js 變量轉為 c++整形 napi_get_value_string_utf8() --- js 變量轉為 c++字符串 napi_get_value_bool() --- js 變量轉為 c++布爾值

這些接口的具體用法和使用場景,可以參考 NodeJs 官方文檔(https://nodejs.org/dist/latest-v20.x/docs/api/n-api.html)

C++程序鏈接 NAPI 庫

OpenHarmony 的 NAPI 接口實現都封裝在 libace_napi.z.so 中,C++程序編譯時需鏈接此庫。對于 DevEco Studio 應用開發的 cpp 代碼,在對應的 CMakeLists.txt 中鏈接。該庫文件在 SDK 目錄下可以找到。

wKgaomVoDXiAE6tWAACZOD3pQ24204.png

對于設備側開發,系統框架中的 C++程序,則通過 BUILD.gn 文件定義依賴關系。

wKgaomVoDXiAJKJ5AAAJs2wWfI8320.png

總結

NAPI 是 JavaScript 與 C++交互的橋梁。在 OpenHarmony 中,Javascript 代碼在運行時由 ArkUI 的 JS 引擎解釋執行,C++代碼則通過 NAPI 接口訪問 JS 引擎中的 Javascript 上下文,從而實現與 JS 變量、方法之間的相互調用。


更多熱點文章閱讀
  • 大佬分享!基于OpenHarmony操作系統無人機
  • DevEco Studio 3.1 Release | 動態共享包開發,編譯更快,包更小
  • Cocos攜手樂元素,《開心消消樂》成功移植OpenHarmony
  • 開源樣例!基于小凌派RK2206的工地檢測平臺設計
  • DevEco Device Tool 3.1 Release新版本發布


原文標題:教程分享!OpenHarmony之NAPI框架介紹

文章出處:【微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電子發燒友
    +關注

    關注

    33

    文章

    557

    瀏覽量

    33314
  • 開源社區
    +關注

    關注

    0

    文章

    95

    瀏覽量

    576

原文標題:教程分享!OpenHarmony之NAPI框架介紹

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構
    的頭像 發表于 03-11 14:13 ?873次閱讀
    北京迅為RK3568開發板<b class='flag-5'>OpenHarmony</b>系統南向驅動開發內核HDF驅動<b class='flag-5'>框架</b>架構

    【貝啟科技BQ3568HM開源鴻蒙開發板深度試用報告】2 - 智能家居中控屏界面設計:打造便捷的家居控制體驗

    設計,并探討其在智能家居中控屏中的應用。 NAPI接口概述 NAPI接口是OpenHarmony提供的一種機制,用于在ArkTS中調用C++編寫的原生模塊。通過NAPI接口,開發者可以
    發表于 01-24 16:11

    AI開發框架集成介紹

    隨著AI應用的廣泛深入,單一框架往往難以滿足多樣化的需求,因此,AI開發框架的集成成為了提升開發效率、促進技術創新的關鍵路徑。以下,是對AI開發框架集成的介紹,由AI部落小編整理。
    的頭像 發表于 01-07 15:58 ?350次閱讀

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    ,真正做到所“鍵”即所得。 這一創新框架的出現,正是為了解決開發者在遷移C/C++項目到HarmonyOS NEXT時面臨的核心痛點。傳統的NAPI接口調用復雜,學習成本高,開發者需要耗費大量精力進行適配
    發表于 01-02 17:08

    OpenHarmony程序分析框架論文入選ICSE 2025

      近日,ICSE 2025軟件工程實踐Track放榜,面向OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)的ArkTS程序分析基礎框架--方舟程序分析器(論文題目為
    的頭像 發表于 01-02 13:41 ?748次閱讀
    <b class='flag-5'>OpenHarmony</b>程序分析<b class='flag-5'>框架</b>論文入選ICSE 2025

    大語言模型開發框架是什么

    大語言模型開發框架是指用于訓練、推理和部署大型語言模型的軟件工具和庫。下面,AI部落小編為您介紹大語言模型開發框架
    的頭像 發表于 12-06 10:28 ?379次閱讀

    2K0300先鋒派Openharmony開發介紹

    *附件:2K0300先鋒派Openharmony開發介紹-241114.pdf
    發表于 11-17 21:36

    第三屆OpenHarmony技術大會星光璀璨、致謝OpenHarmony社區貢獻者

    取得豐碩成果的TSG團隊、OpenHarmony技術俱樂部團隊及個人,本次大會特別舉辦了星光團隊和星光個人授牌儀式。共授牌4個星光TSG,分別是安全及機密計算TSG、跨平臺應用開發框架TSG、編程語言
    的頭像 發表于 10-21 14:10 ?424次閱讀

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發。本案例已在OpenHarmony凌蒙派-RK3568開發
    的頭像 發表于 09-15 08:09 ?681次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發:Hello<b class='flag-5'>Openharmony</b>

    基于ArkTS語言的OpenHarmony APP應用開發:簡易計數器

    的變量值改變時ArkUI開發框架會調用 build() 方法進行頁面的刷新。 2.4、Text控件 Text表示一個文本控件。 2.4.1、Text定義介紹 interface
    發表于 09-14 13:38

    Openharmony軟件評估指南-米爾瑞芯微RK3568開發板

    Openharmony軟件評估指南用于介紹在米爾的開發板上運行Openharmony系統下的核心資源與外設資源的測試步驟與評估方法。本文可作為前期評估指南使用,也可以作為通用系統開發的測試指導書
    發表于 09-06 20:06

    第二屆大會回顧第24期 | 面向OpenHarmony的軟件工程研究:機遇與挑戰

    隨著萬物智聯時代的到來,OpenHarmony作為一個開源的智能終端設備操作系統的框架和平臺,將會遇到哪些機遇和挑戰?北京航空航天大學教授、OpenHarmony技術俱樂部主任黎立在第二屆Op
    的頭像 發表于 08-07 18:14 ?1377次閱讀
    第二屆大會回顧第24期 | 面向<b class='flag-5'>OpenHarmony</b>的軟件工程研究:機遇與挑戰

    鴻蒙OpenHarmony南向/北向快速開發教程-迅為RK3568開發板

    優化開發流程-配置遠程訪問環境 P8_優化開發流程-編譯源碼和燒寫鏡像 P9_OpenHarmony源碼目錄介紹 P10_整體移植方案介紹 P11_編譯目標分析 P12_編譯框架基本概
    發表于 07-23 10:44

    OpenHarmony開機優化

    OpenHarmony已經支持了Bootchart工具,我們可以直接使用Bootchart工具,Bootchart工具介紹如下: 概述 Bootchart是一個用于系統啟動過程性能分析的開源軟件工具
    發表于 07-01 16:39

    OpenHarmony 成功亮相國際學術會議 ASPLOS 2024

    舉行的ASPLOS 2024上成功舉辦。本次學術教程會以“OpenHarmony操作系統的關鍵特性與能力”為主題,聚焦“基于OpenHarmony的前沿學術探索機遇與挑戰“,詳細介紹
    的頭像 發表于 05-16 09:28 ?625次閱讀
    <b class='flag-5'>OpenHarmony</b> 成功亮相國際學術會議 ASPLOS 2024
    主站蜘蛛池模板: 欧美激情综合色综合啪啪五月 | 亚洲一区二区高清 | 亚洲一区在线播放 | 四虎新网站 | 操操片 | 欧美一级高清片欧美国产欧美 | 天堂网2017| 青草青草视频2免费观看 | 在线免费观看视频黄 | 给我一个可以看片的www日本 | 亚洲国产情侣偷自在线二页 | 色咯咯| 性色xxx | abc119影院成人免费看 | 亚洲一区高清 | 天天操夜夜操夜夜操 | 欧美人成在线观看 | 国产未成女年一区二区 | 色秀视频免费网站在线观看 | 色就操| 午夜毛片免费观看视频 | 国产精品久久久亚洲 | 日韩精品一级毛片 | 日本一卡二卡≡卡四卡精品 | 天堂资源最新版在线官网 | 四虎影像 | 91视频观看| 欧美日一区 | 国产三级一区 | 国产色婷婷精品免费视频 | 久久综合五月开心婷婷深深爱 | 亚洲三级成人 | 久久国产精品免费专区 | 女人扒开腿让男人桶到爽 | 巨臀中文字幕一区二区翘臀 | 日本福利网址 | 狠狠色噜噜狠狠狠狠米奇7777 | 性色在线视频精品 | 人人看人人看人做人人模 | www.jizz中国| 亚洲1卡二卡3卡四卡不卡 |