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

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

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

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

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-19 16:57 ? 次閱讀

NAPI(Native API)是OpenHarmony系統(tǒng)中的一套原生模塊擴(kuò)展開發(fā)框架,它基于Node.js N-API規(guī)范開發(fā),為開發(fā)者提供了JavaScript與C/C++模塊之間相互調(diào)用的交互能力。可以在NodeJs官網(wǎng)查看各種NAPI接口定義說明。

NAPI作用

  • OpenHarmony系統(tǒng)可以將框架層豐富的模塊功能通過js接口開放給上層應(yīng)用使用
  • 上層應(yīng)用也可以將一些對性能有要求或者需要調(diào)用到系統(tǒng)側(cè)框架的功能使用C/C++封裝實(shí)現(xiàn),下探到系統(tǒng)層以提高運(yùn)行效率

NAPI在系統(tǒng)中的位置

NAPI在OpenHarmony中屬于ArkUI框架的一部分。

NAIP框架代碼在 foundationarkuinapi 路徑下。總體上可分為interface、native_engine 和 xxxManager 三部分。

interface 目錄為NAPI開發(fā)者提供了各種常用功能的API接口及宏定義。

native_engine 目錄是NAPI框架的核心部分,interface目錄提供的接口對應(yīng)的功能都在這里實(shí)現(xiàn)。C++與Js之間的調(diào)用交互最終是要依托JS引擎來完成的,針對系統(tǒng)支持的不同JS引擎,在impl目錄中也有對應(yīng)的4種實(shí)現(xiàn)(ark, jerryscript, quickjs, v8)。

此外,還有幾個Manager目錄,分別負(fù)責(zé)模塊注冊、引用對象管理、作用域管理等專項(xiàng)功能。

NAPI使用

假設(shè)我們在框架測使用c/c++實(shí)現(xiàn)了hello模塊,該模塊提供了一個接口int hello(const std::string &s),傳入一個字符串,打印該字符串。

要使用js調(diào)用到如上hello接口,需要解決如下幾個問題

  1. 模塊注冊(import的模塊名稱hello,是怎么對應(yīng)到實(shí)際的c++lib庫的?) — Module Manager。
  2. 方法名映射(js調(diào)用的hello方法,是怎么對應(yīng)到native的C/C++的方法的?) — Native Engine。
  3. 數(shù)據(jù)傳遞與轉(zhuǎn)換(js傳入的入?yún)?、得到的返回結(jié)果,需要轉(zhuǎn)換成C/C++代碼可以操作的數(shù)據(jù)類型)

c++方法具體實(shí)現(xiàn):

// hello.h

#ifndef HELLO_H
#define HELLO_H

#include < string >
namespace OHOS {
namespace hello {

int hello(const std::string &s);

} // namespace add
} // namespace OHOS

#endif // HELLO_H
// hello.cpp

#include < iostream >
#include "hello.h"

namespace OHOS {
namespace hello {

int hello(const std::string &s);
{
    std::cout < < s < < endl;
    return 0;
}

} // namespace add
} // namespace OHOS

此時需要為js提供調(diào)用,需要為該接口進(jìn)行NAPI封裝

// helloNapi.cpp

#include "napi/native_api.h"
#include "hello.h"

static napi_value Hello(napi_env env, napi_callback_info info)
{
    // 根據(jù)環(huán)境變量獲取參數(shù)

    // js參數(shù)個數(shù)
    size_t argc = 1;
    // 參數(shù)定義
    napi_value argv[1] = { 0 };
    // 入?yún)⒆兞揩@取
    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
    // 獲取入?yún)⒌念愋?/span>
    napi_valuetype valueType = napi_undefined;
    napi_typeof(env, argv[0], &valueType);
    // js類型的入?yún)⒅缔D(zhuǎn)換為C/C++可以操作的數(shù)據(jù)類型
    char value[VALUE_BUFFER_SIZE] = { 0 };
    size_t valueLen = 0;
    napi_get_value_string_utf8(env, argv[0], value, VALUE_BUFFER_SIZE, &valueLen);
    std::string s = value;

    // 調(diào)用hello接口
    int ret = hello(s);

    // C/C++數(shù)據(jù)類型轉(zhuǎn)換為JS數(shù)據(jù)類型并返回給應(yīng)用層
    // JS字符串對象
    napi_value result = nullptr;
    retult = napi_create_int32(env, ret, &result);

    //返回JS對象
    return result;
}

// 方法名映射
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = {
        { "hello", nullptr, Hello, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END


// nm_modname為提供給應(yīng)用側(cè)調(diào)用的模塊名稱
static napi_module helloModule = {
    .nm_version =1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "hello",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

// 注冊模塊
extern "C" __attribute__((constructor)) void RegisterNative_helloModule(void)
{
    napi_module_register(&helloModule);
}

編譯生成假設(shè)為hello.z.so

js調(diào)用代碼

// hello.ets

// 引入hello napi模塊
import testNapi from '@ohos.hello'

// 調(diào)用js接口 hello
testNapi.hello("hello world")

以上就是簡單的NAPI簡介以及簡單的一個NAPI應(yīng)用開發(fā)模版。更多鴻蒙開發(fā)內(nèi)容,前往主頁:

審核編輯 黃宇

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

    關(guān)注

    57

    文章

    2305

    瀏覽量

    42696
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3646

    瀏覽量

    16071
收藏 人收藏

    評論

    相關(guān)推薦

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

    4.1學(xué)習(xí)之旅了嗎?快來加入我們,一起探索鴻蒙4.1系統(tǒng)的無限魅力吧! 【北京迅為】OpenHarmony學(xué)習(xí)開發(fā)系列教程(第1期 北向基礎(chǔ)篇一) P0_先導(dǎo)課 P1_
    發(fā)表于 07-23 10:44

    【開源鴻蒙】下載OpenHarmony 4.1 Release源代碼

    本文介紹了如何下載開源鴻蒙OpenHarmony)操作系統(tǒng) 4.1 Release版本的源代碼,該方法同樣可以用于下載OpenHarmony最新開發(fā)版本(master分支)或者4.0 Release、3.2 Release等發(fā)
    的頭像 發(fā)表于 04-27 23:16 ?783次閱讀
    【開源<b class='flag-5'>鴻蒙</b>】下載<b class='flag-5'>OpenHarmony</b> 4.1 Release源代碼

    鴻蒙開發(fā)學(xué)習(xí):【OpenHarmony HAR】

    OpenHarmony js/ts三方庫使用的是OpenHarmony靜態(tài)共享包,即HAR(Harmony Archive),可以包含js/ts代碼、c++庫、資源和配置文件。通過HAR,可以實(shí)現(xiàn)
    的頭像 發(fā)表于 03-18 16:27 ?673次閱讀

    薪資高、青春飯,是不是程序員=青樓?

    模型、多端部署、分布式應(yīng)用開發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)、
    發(fā)表于 03-06 21:32

    深圳市24年,實(shí)現(xiàn)鴻蒙原生應(yīng)用數(shù)占全國總量10%以上

    、Harmony南向開發(fā)、鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(Harmony NEXT)技術(shù)知識點(diǎn) 高清完整版與筆記請加→mau123789是衛(wèi)呀 針對鴻蒙成長路線打造的
    發(fā)表于 03-04 21:42

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開發(fā):【短信服務(wù)】

    ://gitee.com/openharmony/applications_app_samples.git git pull origin master ? 最后呢,很多開發(fā)朋友不知道需要學(xué)習(xí)那些鴻蒙
    發(fā)表于 03-03 21:29

    鴻蒙這么大聲勢,為何遲遲看不見崗位?最新數(shù)據(jù)來了

    。 話不多說,我們直接看詳細(xì)資料鴻蒙OpenHarmony學(xué)習(xí)手冊(共計(jì)1236頁)與鴻蒙OpenHarmony )開發(fā)入門教學(xué)視頻
    發(fā)表于 02-29 20:53

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

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

    學(xué)習(xí)鴻蒙背后的價值?星河版開放如何學(xué)習(xí)

    鴻蒙原生內(nèi)核。 實(shí)現(xiàn)了AI框架、大模型、設(shè)計(jì)系統(tǒng)、編程框架、編程語言、編譯器等全棧自研,有核心技術(shù)、全棧能力、底座和生態(tài),是真正的操作系統(tǒng),而非安卓套皮。關(guān)鍵是有了鴻蒙星河版本也就意味著國內(nèi)市場有了
    發(fā)表于 02-22 20:55

    OpenHarmonyNAPI 框架介紹

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

    盤點(diǎn)那些硬件+項(xiàng)目學(xué)習(xí)套件:Hi3861鴻蒙開發(fā)板及入門常見問題解答

    華清遠(yuǎn)見20歲了~過去3年里,華清遠(yuǎn)見研發(fā)中心針對個人開發(fā)板業(yè)務(wù),打造了多款硬件+項(xiàng)目學(xué)習(xí)套件,涉及STM32單片機(jī)、嵌入式、物聯(lián)網(wǎng)、人工智能、鴻蒙、ESP32、阿里云IoT等多技術(shù)方向。 今天我們
    發(fā)表于 02-01 16:55

    鴻蒙不再兼容安卓,那么鴻蒙開發(fā)者是否會大增?

    ? 應(yīng)屆生/計(jì)算機(jī)專業(yè):通過學(xué)習(xí)鴻蒙新興技術(shù),入行互聯(lián)網(wǎng),未來高起點(diǎn)就業(yè)。 0基礎(chǔ)轉(zhuǎn)型:提前布局新方向,抓住風(fēng)口。自我提升,獲得更多就業(yè)機(jī)會。 技術(shù)提升/進(jìn)階跳槽:發(fā)展瓶頸期,提升職場
    發(fā)表于 01-31 22:17

    鴻蒙開發(fā)OpenHarmony組件復(fù)用案例

    ) } }, item => item) } } } 本文主要是對鴻蒙開發(fā)基礎(chǔ)當(dāng)中的OpenHarmony技術(shù)組件復(fù)用示例, 更多鴻蒙開發(fā)
    發(fā)表于 01-15 17:37

    教程分享!OpenHarmonyNAPI框架介紹

    是 C++語言實(shí)現(xiàn)的,這些接口可以幫助 C++代碼創(chuàng)建 JS 變量,或訪問 JavaScript 運(yùn)行環(huán)境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱“
    的頭像 發(fā)表于 11-30 12:15 ?1308次閱讀
    教程分享!<b class='flag-5'>OpenHarmony</b>之<b class='flag-5'>NAPI</b>框架介紹

    OpenHarmonyNAPI框架介紹

    張志成 誠邁科技高級技術(shù)專家 NAPI 是什么 NAPI 的概念源自 Nodejs,為了實(shí)現(xiàn) javascript 腳本與 C++庫之間的相互調(diào)用,Nodejs 對 V8 引擎的 api 做了一層
    發(fā)表于 11-23 15:36