chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony 之 NAPI 框架介紹

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-01 17:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

NAPI 是什么

NAPI 的概念源自 Nodejs,為了實(shí)現(xiàn) javascript 腳本與 C++ 庫之間的相互調(diào)用,Nodejs 對 V8 引擎的 api 做了一層封裝,稱為 NAPI??梢栽?Nodejs 官網(wǎng)上查看各種 NAPI 接口定義說明。

wKgaomW7ZZyAYgmdAACKb1Siseo870.png

wKgZomW7Y7yAVd6uAACKb1Siseo945.png


可以看到,NAPI 接口本身是 C++ 語言實(shí)現(xiàn)的,這些接口可以幫助 C++ 代碼創(chuàng)建 JS 變量,或訪問 JavaScript 運(yùn)行環(huán)境中的 JS 變量與方法。

OpenHarmony 中的 NAPI

OpenAtom OpenHarmony(以下簡稱 “OpenHarmony”)應(yīng)用層基于 javascript 語言開發(fā),而系統(tǒng)框架層則基于 C++ 語言。它們之間需要一個(gè)橋梁來實(shí)現(xiàn)兩種語言代碼之間的相互調(diào)用,這個(gè)橋梁就是 NAPI。

wKgZomW7ZZyAeeaLAAATN4COqqE509.png

wKgZomW7Y8WAE7mMAAATN4COqqE582.png


這里可能有的小伙伴有疑問了:OpenHarmony 的 NAPI 和 NodeJs 的 NAPI 是一回事嗎?應(yīng)該說,OpenHarmony 系統(tǒng)沿用了 NAPI 的接口定義形式,但每個(gè)接口的內(nèi)部實(shí)現(xiàn)都進(jìn)行了重寫。這是因?yàn)?NAPI 接口的本質(zhì)是幫助 C++ 程序去跟 Javascript 引擎交互,因此對于不同的引擎需要有不同的實(shí)現(xiàn)方式。當(dāng)用戶調(diào)用了 NAPI 接口 napi_create_int64 (), 對于 Nodejs 而言,它會去訪問 V8 引擎的 api 創(chuàng)建一個(gè) js 的數(shù)字變量,而對于 OpenHarmony,則是去訪問 ArkUI 框架自己的 js 引擎 (ArkNativeEngine)。在 OpenHarmony 源碼中搜索 napi_create_int64 () 方法,你會得到一份頭文件定義:third_partynodesrcjs_native_api.h 以及兩份不同的實(shí)現(xiàn)代碼:third_partynodesrcjs_native_api_v8.ccfoundationarkuinapinative_enginenative_api.cppnative_api.cpp 是 OpenHarmony 版本的 NAPI 實(shí)現(xiàn),想了解內(nèi)部細(xì)節(jié)的可以從這里入手:

wKgaomW7ZZ2AGsGgAACfJoIejHA705.png

wKgZomW7Y9qARUrEAACfJoIejHA869.png

創(chuàng)建一個(gè)簡單的 NAPI 工程

可以通過 DevEco Studio 的 Native C++ 模板創(chuàng)建一個(gè)包含簡單 NAPI 實(shí)現(xiàn)的樣例工程。

wKgZomW7ZZ2Acnw-AAA4QhHETD8395.png

wKgZomW7ZNmAbzayAAA4QhHETD8531.png

該工程自帶一個(gè) hello.cpp,實(shí)現(xiàn)了一個(gè)能夠被 javascript 代碼調(diào)用的 add () 方法。

wKgaomW7Y_SAOX43AAExJw9GdEo668.png


下面我們就基于這個(gè)簡單的例子,探究一下 NAPI 框架的實(shí)現(xiàn)原理。

應(yīng)用如何調(diào)用 NAPI 接口

應(yīng)用代碼導(dǎo)入對應(yīng)的 so 庫后,就可以調(diào)用該庫實(shí)現(xiàn)的接口。

wKgaomW7ZAmAUrRmAAChcME0Pco291.png


這里我們注意到,導(dǎo)入日志庫時(shí)使用的名稱是 “@ohos.hilog”,應(yīng)用代碼如果寫成 import hilog from ‘libhilog.z.so’ 其實(shí)也是可以成功導(dǎo)入的。實(shí)際上,ArkUI 在運(yùn)行時(shí)會將 @ohos.hilog 轉(zhuǎn)換為 libhilog.z.so,然后到 /system/lib/module/ 目錄下查找此庫并加載。系統(tǒng)實(shí)現(xiàn)的 NAPI 庫都放在 /system/lib/module/ 目錄下,類似的:@ohos.wifiManager 對應(yīng)的是 /system/lib/module/libwifimanager.z.so;@ohos.deviceInfo 對應(yīng)的是 /system/lib//module/libdeviceinfo.z.so

除了系統(tǒng)自帶的 NAPI 庫,應(yīng)用也可以用 C++ 開發(fā)自己的 NAPI 庫。上面例子中 import testNapi from ‘libentry.so’ 導(dǎo)入的就是應(yīng)用自己實(shí)現(xiàn)的。應(yīng)用開發(fā)的 NAPI 庫會隨著應(yīng)用工程一起編譯打包到 hap 文件中,最終部署到 /data 目錄每個(gè)應(yīng)用自己的文件夾下。

wKgZomW7ZBGAc8yeAAEoBFK5F28114.png

NAPI 庫的導(dǎo)入原理

我們知道,應(yīng)用的 javascript 代碼是由 ArkUI 的 JS 引擎解釋執(zhí)行的。當(dāng) JS 引擎解讀 import hilog from ‘@ohos.hilog’; 這行代碼時(shí),會通過 dlopen () 將對應(yīng)的 libhilog.z.so 加載到應(yīng)用進(jìn)程中。這一切是怎么做到的呢?每個(gè)應(yīng)用進(jìn)程在初始化時(shí),都會創(chuàng)建一個(gè)引擎實(shí)例 ArkNativeEngineImpl,我們來看一下它的構(gòu)造函數(shù) foundationarkuinapinative_engineimplarkark_native_engine_impl.cpp

wKgaomW7ZB2AfltZAADrUj9f67g837.png


也就是說,每個(gè)應(yīng)用進(jìn)程的 JS 引擎中,都注冊了一個(gè) “requireNapi” 函數(shù),當(dāng)應(yīng)用調(diào)用此方法時(shí),JS 引擎就會通過 NAPI 框架的 moduleManager 類去處理 so 庫的加載。moduleManager 內(nèi)部最終是找到了 /system/lib/module 下對應(yīng)的 so 文件,并通過 dlopen () 的方式加載到應(yīng)用進(jìn)程中。想了解細(xì)節(jié)的小伙伴可以讀一下 NativeModuleManager::LoadNativeModule () 方法的內(nèi)部實(shí)現(xiàn)。

這里可能會有個(gè)疑問:應(yīng)用的 javascript 代碼中并沒有寫什么 “requireNapi” 的代碼,只有 import xxx,怎么觸發(fā)的導(dǎo)入處理函數(shù)?答案要到編譯后的 js 代碼中尋找。我們解開編譯后的 hap 包,找到 ets 文件對應(yīng)的 js 文件:

wKgZomW7ZCSAUGstAACFYhQ77v0762.png

可以看到,index.ets 被編譯成 index.js 后,import 關(guān)鍵字也被轉(zhuǎn)為了 “requireNapi”,這樣 JS 引擎在執(zhí)行這行代碼時(shí),就會去調(diào)用注冊的導(dǎo)入處理函數(shù)了。

wKgaomW7ZDCADRyLAACFMpZuTZQ193.png

C++ 庫如何實(shí)現(xiàn) JS 方法

前面解決了 JS 導(dǎo) C++ 庫的問題,下一步就是 JS 如何調(diào)用 C++ 庫里的方法了。先說結(jié)論:一個(gè) C++ 方法能否被應(yīng)用調(diào)用,取決與 C++ 代碼有沒有將這個(gè)方法注冊到 JS 引擎。

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

wKgaomW7ZZ6AVP3FAAE30hMfv0s311.png

wKgZomW7ZFWAZWZ9AAE30hMfv0s093.png


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

然后是 Init () 方法。該方法實(shí)現(xiàn)了 Add 方法的注冊。也就是告訴 JS 引擎,將 JS 符號 “add” 與 C++ 方法 “Add” 進(jìn)行關(guān)聯(lián)映射。這樣后續(xù)當(dāng) JS 引擎解釋執(zhí)行 javascript 代碼 “testNapi.add (2, 3)” 時(shí),就會找到 C++ Add () 方法的函數(shù)地址并調(diào)用。如下圖所示:

wKgaomW7ZFuAcLAPAAM0DzxiyGk499.png

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

wKgZomW7ZHGAYxEJAAMwtf_Wu1w075.png

napi_value 不是一個(gè)具體的類型,它類似于 void*,表示的是 JS 變量在 JS 引擎內(nèi)部存儲區(qū)內(nèi)的地址。需要通過對應(yīng)的 NAPI 方法實(shí)現(xiàn),例如:napi_get_value_int32 () — js 變量轉(zhuǎn)為 c++ 整形 napi_get_value_string_utf8 () — js 變量轉(zhuǎn)為 c++ 字符串 napi_get_value_bool () — js 變量轉(zhuǎn)為 c++ 布爾值

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

C++ 程序鏈接 NAPI 庫

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

wKgaomW7ZICAVgNrAACY9zLbKzE999.png


對于設(shè)備側(cè)開發(fā),系統(tǒng)框架中的 C++ 程序,則通過 BUILD.gn 文件定義依賴關(guān)系。

wKgaomW7ZaCAX5EuAAAJck3isig866.png

wKgZomW7ZIeAYCU9AAAJck3isig483.png

總結(jié)

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

審核編輯 黃宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9439

    瀏覽量

    156074
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2131

    瀏覽量

    66175
  • OpenHarmony
    +關(guān)注

    關(guān)注

    31

    文章

    3920

    瀏覽量

    20677
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    觸覺智能RK3576開發(fā)板OpenHarmony開源鴻蒙系統(tǒng)USB控制傳輸功能示例

    本文介紹OpenHarmony開源鴻蒙系統(tǒng)的USB控制傳輸功能實(shí)現(xiàn)及相關(guān)代碼示例,基于觸覺智能RK3576開發(fā)板PurplePiOH2演示。OpenHarmony的USB通信介紹實(shí)現(xiàn)
    的頭像 發(fā)表于 09-30 16:31 ?1195次閱讀
    觸覺智能RK3576開發(fā)板<b class='flag-5'>OpenHarmony</b>開源鴻蒙系統(tǒng)USB控制傳輸功能示例

    【M-K1HSE開發(fā)板免費(fèi)體驗(yàn)】相關(guān)源碼閱讀和分析1-使用XComponent + Vsync 實(shí)現(xiàn)自定義動(dòng)畫

    (HarmonyOS) / OpenHarmony 原生應(yīng)用 (Native App) 項(xiàng)目,它利用了 ArkUI 的 XComponent 組件 和 NAPI (Native API) 框架來實(shí)現(xiàn)高性能
    發(fā)表于 09-03 16:05

    OpenHarmony2025年度競賽訓(xùn)練營重磅開啟

    ? OpenHarmony2025年度競賽訓(xùn)練營 ? ? ? 活動(dòng)介紹 OpenHarmony競賽訓(xùn)練營 旨在引導(dǎo)高校學(xué)生進(jìn)行OpenHarmony產(chǎn)學(xué)研用,培養(yǎng)更多應(yīng)用型人才和產(chǎn)業(yè)需
    的頭像 發(fā)表于 07-16 11:51 ?702次閱讀

    第三屆大會回顧第3期 | FFRT并發(fā)框架OpenHarmony中的設(shè)計(jì)與實(shí)踐

    演講嘉賓 | 黃佑鐘 回顧整理 | 廖 ? 濤 排版校對 | 宋夕明 嘉賓介紹 開發(fā)框架分論壇? 黃佑鐘 ,海思Kirin解決方案并行與異構(gòu)計(jì)算專家。 正文內(nèi)容 多任務(wù)并發(fā)能更有效地利用CPU資源
    的頭像 發(fā)表于 06-21 16:53 ?924次閱讀
    第三屆大會回顧第3期 | FFRT并發(fā)<b class='flag-5'>框架</b>在<b class='flag-5'>OpenHarmony</b>中的設(shè)計(jì)與實(shí)踐

    開源鴻蒙開發(fā)必備!OpenHarmony替換Full SDK全攻略

    本文介紹開源鴻蒙OpenHarmony替換FullSDK的方法,演示設(shè)備為觸覺智能PurplePiOH鴻蒙開發(fā)板獲取FullSD
    的頭像 發(fā)表于 06-06 18:11 ?621次閱讀
    開源鴻蒙開發(fā)必備!<b class='flag-5'>OpenHarmony</b>替換Full SDK全攻略

    貢獻(xiàn) OpenHarmony 庫關(guān)鍵配置

    # 貢獻(xiàn) OpenHarmony 庫關(guān)鍵配置 #自研框架#ArkUI-X#三方框架#OpenHarmony#HarmonyOS ## 創(chuàng)建第三方庫 - 打開 DevEco Stud
    發(fā)表于 05-28 13:46

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1540次閱讀
    北京迅為RK3568開發(fā)板<b class='flag-5'>OpenHarmony</b>系統(tǒng)南向驅(qū)動(dòng)開發(fā)內(nèi)核HDF驅(qū)動(dòng)<b class='flag-5'>框架</b>架構(gòu)

    【貝啟科技BQ3568HM開源鴻蒙開發(fā)板深度試用報(bào)告】2 - 智能家居中控屏界面設(shè)計(jì):打造便捷的家居控制體驗(yàn)

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

    迅為RK3568開發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-編寫內(nèi)核 LED HDF 驅(qū)動(dòng)程序

    接下來編譯 LED 驅(qū)動(dòng),該驅(qū)動(dòng)用于在基于華為設(shè)備框架(HDF)的系統(tǒng)中控制 LED 燈的開關(guān),完整代碼如下所示: 更多內(nèi)容可以關(guān)注:迅為RK3568開發(fā)板篇OpenHarmony
    發(fā)表于 01-17 15:13

    AI開發(fā)框架集成介紹

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

    鴻蒙原生頁面高性能解決方案上線OpenHarmony社區(qū) 助力打造高性能原生應(yīng)用

    Nodepool、HMrouter和DataCache 三大解決方案,并上架OpenHarmony開源社區(qū)分,分別針對應(yīng)用頁面滑動(dòng)、跳轉(zhuǎn)、首頁冷啟動(dòng)等關(guān)鍵性能場景提供高效易用的工具,助力伙伴和開發(fā)者打造
    發(fā)表于 01-02 18:00

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

    ,真正做到所“鍵”即所得。 這一創(chuàng)新框架的出現(xiàn),正是為了解決開發(fā)者在遷移C/C++項(xiàng)目到HarmonyOS NEXT時(shí)面臨的核心痛點(diǎn)。傳統(tǒng)的NAPI接口調(diào)用復(fù)雜,學(xué)習(xí)成本高,開發(fā)者需要耗費(fèi)大量精力進(jìn)行適配
    發(fā)表于 01-02 17:08

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

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

    大語言模型開發(fā)框架是什么

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

    華秋電子 | 電子發(fā)燒友亮相OpenHarmony人才生態(tài)大會2024

    OpenHarmony芯片創(chuàng)新應(yīng)用與生態(tài)”為主題,詳細(xì)介紹了社區(qū)OpenHarmony硬件生態(tài)的發(fā)展現(xiàn)狀,包括社區(qū)開發(fā)者生態(tài)、社區(qū)內(nèi)容生態(tài)、硬件產(chǎn)品等。 電子發(fā)燒友平臺社區(qū)運(yùn)營負(fù)責(zé)人劉勇作主題演講
    發(fā)表于 12-02 09:45