色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

電子發(fā)燒友開源社區(qū) ? 來源:未知 ? 2023-11-30 12:15 ? 次閱讀

NAPI 是什么

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

wKgaomVoDXaAEIhiAACKsNK2uTI532.png

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

OpenHarmony 中的 NAPI

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

wKgaomVoDXaAIg1bAAATeJfNdak212.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 引擎交互,因此對(duì)于不同的引擎需要有不同的實(shí)現(xiàn)方式。

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

以及兩份不同的實(shí)現(xiàn)代碼:

third_party
odesrcjs_native_api_v8.cc
foundationarkui
api
ative_engine
ative_api.cpp

(左右移動(dòng)查看全部?jī)?nèi)容)

native_api.cpp 是 OpenHarmony 版本的 NAPI 實(shí)現(xiàn),想了解內(nèi)部細(xì)節(jié)的可以從這里入手:

wKgaomVoDXaAHg5vAACfZ672Y9U740.png

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

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

wKgaomVoDXaAD7m5AAA4g0WWTpI528.png

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

wKgaomVoDXeAZ_oNAAExaOIHWkE937.png

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

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

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

wKgaomVoDXeAQpUIAAChsVRRkG0548.png

這里我們注意到,導(dǎo)入日志庫(kù)時(shí)使用的名稱是"@ohos.hilog",應(yīng)用代碼如果寫成 import hilog from 'libhilog.z.so' 其實(shí)也是可以成功導(dǎo)入的。

實(shí)際上,ArkUI 在運(yùn)行時(shí)會(huì)將 @ohos.hilog 轉(zhuǎn)換為 libhilog.z.so,然后到 /system/lib/module/ 目錄下查找此庫(kù)并加載。

系統(tǒng)實(shí)現(xiàn)的 NAPI 庫(kù)都放在/system/lib/module/目錄下,類似的:

  • @ohos.wifiManager 對(duì)應(yīng)的是 /system/lib/module/libwifimanager.z.so;

  • @ohos.deviceInfo 對(duì)應(yīng)的是 /system/lib//module/libdeviceinfo.z.so

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

wKgaomVoDXeALQgHAAEoRfL6EPs348.png

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

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

每個(gè)應(yīng)用進(jìn)程在初始化時(shí),都會(huì)創(chuàng)建一個(gè)引擎實(shí)例 ArkNativeEngineImpl,我們來看一下它的構(gòu)造函數(shù)

foundationarkui
api
ative_engineimplarkark_native_engine_impl.cpp

(左右移動(dòng)查看全部?jī)?nèi)容)

wKgaomVoDXeAMAK5AADrkyFWTa4032.png

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

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

wKgaomVoDXeAeAuGAACFo3COaqI892.png

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

wKgaomVoDXeAcE1wAACFc38EnB8472.png

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

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

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

wKgaomVoDXiAJSkWAAE4E8ZHYPc725.png

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

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

wKgaomVoDXiAfWNYAAM0UOoVFnQ341.png

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

wKgaomVoDXiAcCHPAAMw9le05dg911.png

napi_value 不是一個(gè)具體的類型,它類似于 void*,表示的是 JS 變量在 JS 引擎內(nèi)部存儲(chǔ)區(qū)內(nèi)的地址。需要通過對(duì)應(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++布爾值

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

C++程序鏈接 NAPI 庫(kù)

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

wKgaomVoDXiAE6tWAACZOD3pQ24204.png

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

wKgaomVoDXiAJKJ5AAAJs2wWfI8320.png

總結(jié)

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


更多熱點(diǎn)文章閱讀
  • 大佬分享!基于OpenHarmony操作系統(tǒng)無人機(jī)
  • DevEco Studio 3.1 Release | 動(dòng)態(tài)共享包開發(fā),編譯更快,包更小
  • Cocos攜手樂元素,《開心消消樂》成功移植OpenHarmony
  • 開源樣例!基于小凌派RK2206的工地檢測(cè)平臺(tái)設(shè)計(jì)
  • DevEco Device Tool 3.1 Release新版本發(fā)布


原文標(biāo)題:教程分享!OpenHarmony之NAPI框架介紹

文章出處:【微信公眾號(hào):電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    33

    文章

    552

    瀏覽量

    32999
  • 開源社區(qū)
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    446

原文標(biāo)題:教程分享!OpenHarmony之NAPI框架介紹

文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AKI跨語(yǔ)言調(diào)用庫(kù)讓C/C++代碼遷移至HarmonyOS NEXT更高效 AKI跨語(yǔ)言調(diào)用庫(kù)神助攻C/C++代碼遷移至HarmonyOS NEXT

    打造鴻蒙原生應(yīng)用過程中廣泛使用的跨語(yǔ)言調(diào)用解決方案。 AKI是一款專為鴻蒙原生開發(fā)設(shè)計(jì)的FFI(外部函數(shù)接口)開發(fā)框架。它極大地簡(jiǎn)化了JS與C/C++之間的跨語(yǔ)言訪問,為開發(fā)者提供了一種邊界性編程
    發(fā)表于 01-02 17:08

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

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

    2K0300先鋒派Openharmony開發(fā)介紹

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

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

    優(yōu)化開發(fā)流程-配置遠(yuǎn)程訪問環(huán)境 P8_優(yōu)化開發(fā)流程-編譯源碼和燒寫鏡像 P9_OpenHarmony源碼目錄介紹 P10_整體移植方案介紹 P11_編譯目標(biāo)分析 P12_編譯框架基本概
    發(fā)表于 07-23 10:44

    OpenHarmony開機(jī)優(yōu)化

    OpenHarmony已經(jīng)支持了Bootchart工具,我們可以直接使用Bootchart工具,Bootchart工具介紹如下: 概述 Bootchart是一個(gè)用于系統(tǒng)啟動(dòng)過程性能分析的開源軟件工具
    發(fā)表于 07-01 16:39

    OpenHarmony 成功亮相國(guó)際學(xué)術(shù)會(huì)議 ASPLOS 2024

    舉行的ASPLOS 2024上成功舉辦。本次學(xué)術(shù)教程會(huì)以“OpenHarmony操作系統(tǒng)的關(guān)鍵特性與能力”為主題,聚焦“基于OpenHarmony的前沿學(xué)術(shù)探索機(jī)遇與挑戰(zhàn)“,詳細(xì)介紹
    的頭像 發(fā)表于 05-16 09:28 ?445次閱讀
    <b class='flag-5'>OpenHarmony</b> 成功亮相國(guó)際學(xué)術(shù)會(huì)議 ASPLOS 2024

    開發(fā)者手機(jī) AI - 目標(biāo)識(shí)別 demo

    Lite的API接口實(shí)現(xiàn)主要功能; Mindspore Lite為Openharmony AI推理框架,為上層應(yīng)用提供統(tǒng)一的AI推理接口,可以完成在手機(jī)等端側(cè)設(shè)備中的模型推理過程; Neural
    發(fā)表于 04-11 16:14

    【六】Purple Pi OH開發(fā)板帶你7天入門OpenHarmony

    今天我們來從OpenHarmony簡(jiǎn)介、環(huán)境搭建、創(chuàng)建第一個(gè)OpenHarmony項(xiàng)目等方面開始OpenHarmony應(yīng)用開發(fā)的第一步。一.OpenHarmony簡(jiǎn)介
    的頭像 發(fā)表于 03-14 08:31 ?555次閱讀
    【六】Purple Pi OH開發(fā)板帶你7天入門<b class='flag-5'>OpenHarmony</b>!

    介紹一種OpenAtom OpenHarmony輕量系統(tǒng)適配方案

    本文在不改變?cè)邢到y(tǒng)基礎(chǔ)框架的基礎(chǔ)上, 介紹了一種OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)輕量系統(tǒng)適配方案。
    的頭像 發(fā)表于 03-05 09:24 ?1202次閱讀
    <b class='flag-5'>介紹</b>一種OpenAtom <b class='flag-5'>OpenHarmony</b>輕量系統(tǒng)適配方案

    【鴻蒙】NAPI 框架生成工具實(shí)現(xiàn)流程

    NAPI 框架生成工具 可以根據(jù)用戶指定路徑下的 ts(typescript)接口文件一鍵生成 NAPI 框架代碼、業(yè)務(wù)代碼框架、GN 文件
    的頭像 發(fā)表于 02-28 17:00 ?698次閱讀
    【鴻蒙】<b class='flag-5'>NAPI</b> <b class='flag-5'>框架</b>生成工具實(shí)現(xiàn)流程

    OpenHarmony4.0源碼解析媒體框架

    媒體框架簡(jiǎn)介 媒體框架 multimedia_player_framework 主要提供音視頻的錄制與播放功能。 框架簡(jiǎn)介 從框架圖中可以看出,媒體
    的頭像 發(fā)表于 02-26 22:05 ?956次閱讀
    <b class='flag-5'>OpenHarmony</b>4.0源碼解析<b class='flag-5'>之</b>媒體<b class='flag-5'>框架</b>

    【鴻蒙】OpenHarmony 4.0藍(lán)牙代碼結(jié)構(gòu)簡(jiǎn)析

    /master/api當(dāng)前所有應(yīng)用層接口統(tǒng)一歸并到interface倉(cāng);api 10中藍(lán)牙接口按照profile拆分了多個(gè)d.ts文件 框架層https://gitee.com/openharmony/communication_bluetooth該倉(cāng)之前包含
    的頭像 發(fā)表于 02-26 16:08 ?1583次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b> 4.0藍(lán)牙代碼結(jié)構(gòu)簡(jiǎn)析

    OpenHarmony NAPI 框架介紹

    環(huán)境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡(jiǎn)稱 “OpenHarmony”)應(yīng)用層基于 javascript
    的頭像 發(fā)表于 02-01 17:34 ?715次閱讀
    <b class='flag-5'>OpenHarmony</b> <b class='flag-5'>之</b> <b class='flag-5'>NAPI</b> <b class='flag-5'>框架</b><b class='flag-5'>介紹</b>

    鴻蒙OpenHarmony NAPI技術(shù)-基礎(chǔ)學(xué)習(xí)

    NAPI(Native API)是OpenHarmony系統(tǒng)中的一套原生模塊擴(kuò)展開發(fā)框架,它基于Node.js N-API規(guī)范開發(fā),為開發(fā)者提供了JavaScript與C/C++模塊之間相互調(diào)用的交互能力。可以在NodeJs官網(wǎng)
    的頭像 發(fā)表于 01-19 16:57 ?989次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b> <b class='flag-5'>NAPI</b>技術(shù)-基礎(chǔ)學(xué)習(xí)

    OpenHarmony圖形HDI基礎(chǔ)適配及點(diǎn)屏

    本文檔主要介紹圖形基礎(chǔ)適配及點(diǎn)屏。 環(huán)境說明: OHOS版本: 適用3.2-Beta3及以上 內(nèi)核版本: linux-5.10 硬件環(huán)境: Dayu200-rk3568及其它硬件 一、圖形驅(qū)動(dòng)測(cè)試
    發(fā)表于 01-18 14:49
    主站蜘蛛池模板: 亚洲AV无码国产精品色在线看| 真实处破女全过程完免费观看| 日本人奶水中文影片| 秋霞网在线伦理影片| 青青草原国产| 涩涩爱涩涩电影网站| 午夜影院费试看黄| 亚洲中文在线精品国产| 10分钟免费观看视频| JAVASCRIPTJAVA水多多| 俄罗斯雏妓的BBB孩交| 国产欧美二区综合| 久草在在线免视频在线观看| 蜜芽一区二区国产精品| 日韩高清毛片| 亚洲精品久久久午夜福利电影网| 征服艳妇后宫春色| 成人国产亚洲精品A区天堂蜜臀| 国产精品久久久久无码AV色戒 | 三级叫床震大尺度视频| 午夜在线观看免费完整直播网页| 亚洲一区在线播放| ca88亚洲城娱乐| 国产欧美一区二区精品仙草咪| 久久人人玩人妻潮喷内射人人| 欧美人成在线观看ccc36| 午夜伦理:伦理片| 最新精品国产| 国产精品99久久久久久人韩国| 久久精品综合网中文字幕| 人人模人人干| 亚洲野狼综合网站| 饱满奶大30p| 激情欧美日韩一区二区| 欧美 亚洲 有码中文字幕| 无码一卡二卡三卡四卡| 2012中文字幕手机在线| 国产精品福利片| 免费看美女的网站| 午夜福利网国产A| 99欧美精品|