天天看點

OpenHarmony 源碼解析之JavaScript API架構(NAPI)

JS API: JavaScript Application Programming Interface, JavaScript應用程式程式設計接口。

OpenHarmony上JS API實作方式有三種,分别是:JSI機制、Channel機制、NAPI機制。

JSI機制:L0~L1裝置支援。

Channel機制:L3裝置支援。

NAPI機制:目前僅L2裝置支援,後續須推廣到L3~L5裝置。

OpenHarmony 源碼解析之JavaScript API架構(NAPI)

一句話概括NAPI,就是L2裝置上的 JS API實作方式。

優先封裝異步方法!同步方法可待社群回報需要時再行添加。

若引擎開啟<code>Promise</code>特性支援,則異步方法必須同時支援<code>Callback</code>方式和<code>Promise</code>方式。使用哪種方式由應用開發者決定,以是否傳遞<code>Callback</code>進行區分。不傳遞<code>Callback</code>即為<code>Promise</code>方式,方法執行結果為<code>Promise</code>執行個體對象。

<code>L0</code>到<code>L1</code>裝置上受限于硬體水準,隻實作<code>Callback</code>方式的異步方法;

<code>L2</code>到<code>L5</code>裝置上,必須實作同時支援<code>Callback</code>方式和<code>Promise</code>方式的異步方法。

Promise 異步模型是 OHOS 标準異步模型之一。

Promise對象: ES6原生提供了Promise對象,Promise是異步程式設計的一種解決方案,可以替代傳統的解決方案--回調函數和事件。promise對象是一個異步操作的結果,提供了一些API使得異步執行可以按照同步的流表示出來,避免了層層嵌套的回調函數,保證了回調是以異步的方式進行調用的。使用者在調用這些接口的時候,接口實作将異步執行任務,同時傳回一個 Promise 對象,其代表異步操作的結果。在傳回的結果的個數超過一個時,其以對象屬性的形式傳回。

Promise特點 作為對象,Promise有兩個特點:(1)對象的狀态不受外界影響;(2)一旦狀态改變了就不會再變,也就是說任何時候Promise都隻有一種狀态。

Callback 異步模型是 OHOS 标準異步模型之一。使用者在調用這些接口的時候,接口實作将異步執行任務。任務執行結果以參數的形式提供給使用者注冊的回調函數。這些參數的第一個是 Error 或 undefined 類型,分别表示執行出錯與正常。

API集合按業務功能進行子產品劃分。開發者使用前須import對應的子產品。

命名:<code>@ohos.子產品名</code>

注意:

子產品名須唯一,由<code>ACE</code>團隊統一維護,子系統新增子產品時須向<code>ACE</code>團隊申請。

子產品名最好是單個名詞。實在不行,也可以由多個名詞組成,但必須遵循<code>小駝峰</code>命名規則。

一個子產品,一個聲明檔案(<code>*.d.ts</code>)。聲明檔案命名遵循<code>@ohos.子產品名.d.ts</code>,檔案名全小寫,單詞間無分割。

N-API通過注冊函數進行子產品的注冊,其接受一個全局變量參數,全局變量結構體中定義了子產品名及子產品初始化函數。在子產品的初始化中,我們可以定義子產品需要暴露的方法及屬性。

示例:

```C++

static napi_value StorageExport(napi_env env, napi_value exports)

{

const char* storageClassName = "Storage";

napi_value storageClass = nullptr;

/ 定義子產品需要對外暴露的方法 /

static napi_property_descriptor storageDesc[] = {

DECLARE_NAPI_FUNCTION("get", JSStorageGet),

DECLARE_NAPI_FUNCTION("getSync", JSStorageGetSync),

};

/ 定義C++類對應的JavaScript類,包括JS類名、JS構造函數 /

napi_define_class(env, storageClassName, strlen(storageClassName), JSStorageConstructor, nullptr,

sizeof(storageDesc) / sizeof(storageDesc[0]), storageDesc, &amp;storageClass);

/ 定義子產品需要對外暴露的屬性 /

static napi_property_descriptor desc[] = {

DECLARE_NAPI_PROPERTY("Storage", storageClass),

/ 設定exports對象屬性 /

napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);

return exports;

}

static napi_module storageModule = {

.nm_version = 1,

.nm_flags = 0,

.nm_filename = nullptr,

.nm_register_func = StorageExport,

.nm_modname = "storage",

.nm_priv = ((void*)0),

.reserved = { 0 },

聲明檔案模闆

<code>@ohos.子產品名.d.ts</code>檔案:

聲明檔案<code>@ohos.storage.d.ts</code>

JS API 調用流程如下圖所示:

OpenHarmony 源碼解析之JavaScript API架構(NAPI)

接口定義

```c++

/入參

napi_env:表示一個上下文的變量;

napi_callback_info:傳遞給回調函數的一個封裝的資料類型,可以用于擷取有關調用時的上下文資訊,也可以用于設定回調函數的傳回值;

傳回值

napi_value:對所有js的基本值的一個密閉封裝,就是表示一個基本值;

*/

static napi_value Get(napi_env env, napi_callback_info info);

static napi_value GetSync(napi_env env, napi_callback_info info);

示例

聲明

實作

static napi_value GetSync(napi_env env, napi_callback_info info)

size_t requireArgc = 1;

size_t argc = 2; //參數個數

napi_value argv[2] = { 0 }; //參數定義

napi_value thisVar = nullptr; //JS對象的this參數

void* data = nullptr; //回調資料指針

異步回調流程如下圖所示:

OpenHarmony 源碼解析之JavaScript API架構(NAPI)

static napi_value Get(napi_env env, napi_callback_info info)

size_t argc = 3; //參數個數

napi_value argv[3] = { 0 }; //參數定義

作者:趙軍霞

更多原創内容請關注:開鴻 HarmonyOS 學院

入門到精通、技巧到案例,系統化分享HarmonyOS開發技術,歡迎投稿和訂閱,讓我們一起攜手前行共建鴻蒙生态。

想了解更多關于鴻蒙的内容,請通路:

51CTO和華為官方戰略合作共建的鴻蒙技術社群

https://harmonyos.51cto.com/#bkwz

OpenHarmony 源碼解析之JavaScript API架構(NAPI)

繼續閱讀