一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

鴻蒙開發(fā)接口公共事件與通知:【FFI能力】 N-API在Android、iOS平臺(tái)應(yīng)用的使用指導(dǎo)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-25 16:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

N-APIAndroid平臺(tái)應(yīng)用的使用指導(dǎo)

N-API接口可以實(shí)現(xiàn)ArkTS/TS/JS與C/C++(Native)之間的交互,ArkUI-X中支持的N-API接口情況和使用場景請見[FFI能力(N-API)]。本文檔以[ArkUI-X/Samples]中的Native樣例工程為例,介紹如何在Android平臺(tái)上使用N-API能力完成跨語言調(diào)用。

開發(fā)流程

使用N-API完成跨語言調(diào)用的整體開發(fā)流程分為以下五步,即

  1. 環(huán)境準(zhǔn)備:獲取Native工程。
  2. 提供Native能力:使用N-API接口提供Native能力,同時(shí),Native接口中還可調(diào)用ArkTS/TS/JS傳入的方法。
  3. 定義接口聲明:添加Native側(cè)暴露給ArkTS側(cè)接口的聲明。
  4. 調(diào)用Native能力:ArkTS/TS/JS側(cè)使用Native能力。
  5. 編譯與運(yùn)行應(yīng)用:編出應(yīng)用,并在android平臺(tái)上運(yùn)行,觀察效果。
  6. 開發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]點(diǎn)擊或者復(fù)制轉(zhuǎn)到。

這里通過修改樣例工程,提供兩個(gè)例子來介紹N-API的典型使用場景:

  1. 提供一個(gè)名為Add的Native方法,ArkTS側(cè)調(diào)用該方法并傳入兩個(gè)number,Native方法將這兩個(gè)number相加并返回到ArkTS側(cè)。以此介紹:ArkTS側(cè)如何調(diào)用到Native側(cè)方法。
  2. 提供一個(gè)名為NativeCallArkTS的Native方法,ArkTS側(cè)調(diào)用該方法并傳入一個(gè)ArkTS function,Native方法中調(diào)用這個(gè)ArkTS function,并將其結(jié)果返回ArkTS側(cè)。以此介紹:Native側(cè)如何調(diào)用到ArkTS側(cè)方法。

1. 環(huán)境準(zhǔn)備

從[ArkUI-X/Samples]中獲取Native樣例工程,并使用DevEco Studio(V4.0 Beta2及以上版本)打開該工程,打開后將自動(dòng)進(jìn)行工程初始化。

2. 提供Native能力

利用N-API接口,進(jìn)行Native能力開發(fā)。同時(shí),本樣例中的NativeCallArkTS也完成了Native側(cè)調(diào)ArkTS側(cè)的演示。

// entrysrcmaincpphello.cpp,包含Native側(cè)邏輯。
// 引入N-API相關(guān)頭文件。
#include "napi/native_api.h"

// 開發(fā)者提供的Native方法,入?yún)⒂星覂H有如下兩個(gè),開發(fā)者不需進(jìn)行變更。
// napi_env 為當(dāng)前運(yùn)行的上下文。
// napi_callback_info 記錄了一些信息,包括從ArkTS側(cè)傳遞過來參數(shù)等。
static napi_value Add(napi_env env, napi_callback_info info)
{
    // 期望從ArkTS側(cè)獲取的參數(shù)的數(shù)量,napi_value可理解為ArkTS value在Native方法中的表現(xiàn)形式。
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    
    // 從info中,拿到從ArkTS側(cè)傳遞過來的參數(shù),此處獲取了兩個(gè)ArkTS參數(shù),即arg[0]和arg[1]。
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    // 獲取arg[0]的類型
    napi_valuetype valuetype0 = napi_undefined;
    napi_typeof(env, args[0], &valuetype0);

    // 獲取arg[1]的類型
    napi_valuetype valuetype1 = napi_undefined;
    napi_typeof(env, args[1], &valuetype1);

    // 校驗(yàn)入?yún)㈩愋?,若不是number,則返回undefined
    if ((valuetype0 != napi_number) || (valuetype1 != napi_number)) {
        napi_value undefined = nullptr;
        napi_get_undefined(env, &undefined);
        return undefined;
    }

    // 將獲取的ArkTS參數(shù)轉(zhuǎn)換為Native信息,此處ArkTS側(cè)傳入了兩個(gè)number,這里將其轉(zhuǎn)換為Native側(cè)可以操作的double類型。
    double value0;
    napi_get_value_double(env, args[0], &value0);

    double value1;
    napi_get_value_double(env, args[1], &value1);
    
    // Native側(cè)的業(yè)務(wù)邏輯,這里簡單以兩數(shù)相加為例。
    double nativeSum = value0 + value1;
    
    // 此處將Native側(cè)業(yè)務(wù)邏輯處理結(jié)果轉(zhuǎn)換為ArkTS值,并返回給ArkTS。
    napi_value sum = nullptr;
    napi_create_double(env, nativeSum , &sum);
    return sum;
}

static napi_value NativeCallArkTS(napi_env env, napi_callback_info info)
{
    // 期望從ArkTS側(cè)獲取的參數(shù)的數(shù)量,napi_value可理解為ArkTS value在Native方法中的表現(xiàn)形式。
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    
    // 從info中,拿到從ArkTS側(cè)傳遞過來的參數(shù),此處獲取了一個(gè)ArkTS參數(shù),即arg[0]。
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    // 獲取arg[0]的類型
    napi_valuetype valuetype = napi_undefined;
    napi_typeof(env, args[0], &valuetype);

    // 校驗(yàn)入?yún)㈩愋?/span>
    if (valuetype != napi_function) {
        napi_value undefined = nullptr;
        napi_get_undefined(env, &undefined);
        return undefined;
    }
    
    // 創(chuàng)建一個(gè)ArkTS string作為ArkTS function的入?yún)ⅰ?/span>
    napi_value argv = nullptr;
    // 創(chuàng)建一個(gè)js string
    napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &argv);
    
    napi_value result = nullptr;
    // Native方法中調(diào)用ArkTS function,其返回值保存到result中并返到ArkTS側(cè)。
    napi_call_function(env, nullptr, args[0], 1, &argv, &result);
    
    return result;
}

EXTERN_C_START
// Init將在exports上掛上Add/NativeCallArkTS這些Native方法,此處的exports就是開發(fā)者import之后獲取到的ArkTS對象。
static napi_value Init(napi_env env, napi_value exports)
{
    // 函數(shù)描述結(jié)構(gòu)體,以Add為例,第三個(gè)參數(shù)"Add"為上述的Native方法,
    // 第一個(gè)參數(shù)"add"為ArkTS側(cè)對應(yīng)方法的名稱。
    napi_property_descriptor desc[] = {
        { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "nativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr },
    };
    // 在exports這個(gè)ArkTS對象上,掛載Native方法。
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

// 準(zhǔn)備模塊加載相關(guān)信息,將上述Init函數(shù)與本模塊名等信息記錄下來。
static napi_module demoModule = {
    .nm_version =1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "entry",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

// 打開so時(shí),該函數(shù)將自動(dòng)被調(diào)用,使用上述demoModule模塊信息,進(jìn)行模塊注冊相關(guān)動(dòng)作。
extern "C" __attribute__((constructor)) void RegisterHelloModule(void)
{
    napi_module_register(&demoModule);
}

3. 定義接口聲明

d.ts文件中添加暴露接口聲明

// entrysrcmaincpptypeslibentryindex.d.ts,包含Native側(cè)暴露給ArkTS側(cè)接口的聲明。
// Native側(cè)暴露給ArkTS側(cè)接口的聲明。
export const add: (a: number, b: number) = > number;
export const nativeCallArkTS: (a: object) = > string;

4. 調(diào)用Native能力

在ArkTS/TS/JS側(cè)使用Native能力。

  1. entry.add接口完成了ArkTS -> Native的調(diào)用。
  2. entry.nativeCallArkTS接口完成了ArkTS -> Native -> ArkTS的調(diào)用。
// entrysrcmainetspagesIndex.ets,包含ArkTS側(cè)邏輯。
// 通過import的方式,引入Native能力。
import entry from 'libentry.so'

function TestFunction(str) {
  let ret = str + ' world!'
  return ret;
}

@Entry
@Component
struct Index {
  @State message: string = 'Test native api: 2 + 3 = ?'
  @State message2: string = 'Click me'

  build() {
    Row() {
      Column() {
        // 第一個(gè)按鈕,調(diào)用add方法,對應(yīng)到Native側(cè)的Add方法,進(jìn)行兩數(shù)相加。
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() = > {
            this.message = "Test native api: 2 + 3 = " + entry.add(2, 3);
            console.log("Test NAPI 2 + 3 = " + entry.add(2, 3));
          })
        // 第二個(gè)按鈕,調(diào)用nativeCallArkTS方法,對應(yīng)到Native的NativeCallArkTS,在Native中執(zhí)行ArkTS function。
        Text(this.message2)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() = > {
            this.message2 = entry.nativeCallArkTS(TestFunction);
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

5. 編譯與運(yùn)行應(yīng)用

點(diǎn)擊DevEco Studio(V4.0 Beta2及以上版本)中的"Build > Build Hap(s)/APP(s) > Build APP(s)"進(jìn)行編譯,并利用Android Studio打開Native工程的".arkui-xandroid"文件夾,點(diǎn)擊"Run app"按鈕后運(yùn)行應(yīng)用。應(yīng)用運(yùn)行后,點(diǎn)擊頁面上的兩個(gè)文本,文本做出相應(yīng)變換。 運(yùn)行效果

開發(fā)建議

注冊建議

  • nm_register_func對應(yīng)的函數(shù)(如上述Init函數(shù))需要加上static,防止與其他so里的符號(hào)沖突。
  • 模塊注冊的入口,即使用__attribute__((constructor))修飾的函數(shù)的函數(shù)名(如上述RegisterHelloModule函數(shù))需要確保不與其他模塊重復(fù)。

so命名規(guī)則

so命名必須符合以下規(guī)則:

  • 每個(gè)模塊對應(yīng)一個(gè)so。
  • 如模塊名為entry,則so的名字為libentry.so,napi_modulenm_modname字段應(yīng)為entry,大小寫與模塊名保持一致,應(yīng)用使用時(shí)寫作:import entry from 'libentry.so'。

JS對象線程限制

ArkCompiler會(huì)對JS對象線程進(jìn)行保護(hù),使用不當(dāng)會(huì)引起應(yīng)用crash,因此需要遵循如下原則:

  • N-API接口只能在JS線程使用。
  • Native接口入?yún)⒌膃nv與線程綁定,不能跨線程使用。Native側(cè)JS對象只能在創(chuàng)建時(shí)的線程使用,即與線程所持有的env綁定。

頭文件引入限制

在引入頭文件時(shí),需引入"napi/native_api.h",否則會(huì)出現(xiàn)N-API接口無法找到的編譯報(bào)錯(cuò)。

HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

搜狗高速瀏覽器截圖20240326151450.png

N-API在iOS平臺(tái)應(yīng)用的使用指導(dǎo)

N-API接口可以實(shí)現(xiàn)ArkTS/TS/JS與C/C++(Native)之間的交互,ArkUI-X中支持的N-API接口情況和使用場景請見[FFI能力(N-API)]。N-API在iOS平臺(tái)上的使用方式中,除去"編譯與運(yùn)行應(yīng)用"環(huán)節(jié)與Android平臺(tái)略有差異外,其余部分均與Android平臺(tái)相同。本文檔將主要介紹N-API在iOS平臺(tái)上的"編譯與運(yùn)行應(yīng)用"環(huán)節(jié),其他環(huán)節(jié)可參考[N-API在Android平臺(tái)應(yīng)用的使用指導(dǎo)]。

編譯與運(yùn)行應(yīng)用

相較于Android平臺(tái),iOS平臺(tái)上編譯/運(yùn)行Native工程時(shí)需要進(jìn)行簽名操作,完整步驟如下:

  1. 點(diǎn)擊DevEco Studio(V4.0 Beta2及以上版本)中的"Build > Build Hap(s)/APP(s) > Build APP(s)"進(jìn)行編譯。
  2. 使用Xcode工具打開".arkui-xios"文件,在Xcode中完成簽名操作。 簽名
  3. 點(diǎn)擊Xcode中的運(yùn)行按鈕以完成二次打包,運(yùn)行應(yīng)用。 運(yùn)行結(jié)果
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 移動(dòng)開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    10370
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    68137
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33109
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18638
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    191

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    AndroidiOS、鴻蒙平臺(tái)框架ArkUI-X

    AndroidiOS、鴻蒙多個(gè)平臺(tái)上提供生動(dòng)而流暢的用戶界面體驗(yàn)。 一、配套關(guān)系 表1 版本軟件和平臺(tái)配套關(guān)系 目標(biāo)
    的頭像 發(fā)表于 01-31 14:52 ?2161次閱讀
    跨<b class='flag-5'>Android</b>、<b class='flag-5'>iOS</b>、<b class='flag-5'>鴻蒙</b>多<b class='flag-5'>平臺(tái)</b>框架ArkUI-X

    鴻蒙開發(fā)接口公共事件與通知:【@ohos.commonEvent (公共事件模塊)】

    本模塊首批接口API version 7開始支持。后續(xù)版本的新增接口,采用上角標(biāo)單獨(dú)標(biāo)記接口的起始版本。
    的頭像 發(fā)表于 05-21 11:13 ?1812次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>接口</b><b class='flag-5'>公共事</b>件與<b class='flag-5'>通知</b>:【@ohos.commonEvent (<b class='flag-5'>公共事</b>件模塊)】

    鴻蒙開發(fā)接口公共事件與通知:【@ohos.events.emitter (Emitter)】

    本模塊首批接口API version 7開始支持。
    的頭像 發(fā)表于 05-21 16:06 ?1859次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>接口</b><b class='flag-5'>公共事</b>件與<b class='flag-5'>通知</b>:【@ohos.events.emitter (Emitter)】

    鴻蒙開發(fā)接口公共事件與通知:【Notification模塊】

    本模塊首批接口API version 7開始支持。后續(xù)版本的新增接口,采用上角標(biāo)單獨(dú)標(biāo)記接口的起始版本。
    的頭像 發(fā)表于 05-21 17:04 ?2916次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>接口</b><b class='flag-5'>公共事</b>件與<b class='flag-5'>通知</b>:【Notification模塊】

    鴻蒙ArkUI-X跨語言調(diào)用說明:【平臺(tái)橋接開發(fā)指南(Android)Bridge API

    本模塊提供ArkUI端和AndroidiOS平臺(tái)端消息通信的功能,包括數(shù)據(jù)傳輸、方法調(diào)用和事件調(diào)用。需配套平臺(tái)API使用,
    的頭像 發(fā)表于 05-25 16:30 ?1303次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI-X跨語言調(diào)用說明:【<b class='flag-5'>平臺(tái)</b>橋接<b class='flag-5'>開發(fā)</b>指南(<b class='flag-5'>Android</b>)Bridge <b class='flag-5'>API</b>】

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-通知添加行為意圖

    WantAgent提供了封裝行為意圖的能力,這里所說的行為意圖主要是指拉起指定的應(yīng)用組件及發(fā)布公共事件等能力。HarmonyOS支持以通知的形式,將WantAgent從發(fā)布方傳遞至接收
    發(fā)表于 01-05 15:07

    鴻蒙實(shí)戰(zhàn)開發(fā)-如何安全和高效的使用N-API開發(fā)Native模塊

    基礎(chǔ)能力的介紹,同時(shí),方舟 ArkTS 運(yùn)行時(shí)提供的 N-API 接口,封裝了方舟引擎的能力,功能上與 Node.js 社區(qū)保持一致,這里
    發(fā)表于 05-09 15:55

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā)公共事件的訂閱和發(fā)布

    /d05_CustomCommonEvent API接口:9 2、知識(shí)準(zhǔn)備 2.1、commonEvent模塊 OpenHarmony通過CES(Common Event Service,公共事件服務(wù))為
    發(fā)表于 09-18 13:16

    ArkUI-x跨平臺(tái)Bridge最佳實(shí)踐

    ;一碼三平臺(tái)\" 前面講到的bridge主要是解決開發(fā)進(jìn)行ArkTS代碼開發(fā)時(shí),需要使用的鴻蒙API
    發(fā)表于 06-10 23:06

    HarmonyOS應(yīng)用開發(fā)-公共事件處理

    開發(fā)過程中service想要控制多個(gè)ability時(shí),可以考慮使用公共事件處理。發(fā)布無序的公共事件: //發(fā)布公共事件 同步修改卡片與頁面
    發(fā)表于 11-02 15:15

    HarmonyOS-API7相對API6差異主要變更內(nèi)容

    條件、循環(huán)渲染、懶加載渲染,支持自定義組件。JS新增5800+的API接口,覆蓋多個(gè)能力模塊:新增一系列事件通知能力接口,可實(shí)現(xiàn)普通
    發(fā)表于 02-15 14:35

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTSAPI系統(tǒng)能力SystemCapability

    一、 系統(tǒng)能力API SysCap,全稱SystemCapability,即系統(tǒng)能力,指操作系統(tǒng)中每一個(gè)相對獨(dú)立的特性,如包管理、公共事件、通知
    發(fā)表于 08-10 16:39

    OpenHarmony 應(yīng)用開發(fā)SDK、API 與基礎(chǔ)工具

    ArkTS 對象的能力,使用類 Node 的 N-API 接口命名。開發(fā)者使用 C/C++開發(fā)業(yè)務(wù),通過
    發(fā)表于 09-19 15:45

    N-API的JS堆對象生命周期管理

    N-API是Node API的簡寫,同時(shí)也是nodejs的JS VM(鏈)接入原生模塊.node文件的應(yīng)用程序二進(jìn)制接口(i.e. ABI)。借助N-API引入的抽象隔離,升級(jí)node
    的頭像 發(fā)表于 12-29 09:41 ?832次閱讀
    <b class='flag-5'>N-API</b>的JS堆對象生命周期管理

    鴻蒙開發(fā)接口公共事件與通知:【FFI能力(Node-API)】

    Node-API是封裝底層JavaScript運(yùn)行時(shí)能力的一套Native接口。OpenHarmony的N-API組件對Node-API
    的頭像 發(fā)表于 05-21 16:38 ?1394次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>接口</b><b class='flag-5'>公共事</b>件與<b class='flag-5'>通知</b>:【<b class='flag-5'>FFI</b><b class='flag-5'>能力</b>(Node-<b class='flag-5'>API</b>)】