成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony 源碼解析之 JavaScriptAPI NAPI-C 接口

開發 前端
NAPI機制在整個OpenHarmony系統中起著承上啟下的重要作用,而框架代碼中C實現的比例也很大,尤其是對接驅動這方面。

[[438474]]

想了解更多內容,請訪問:

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

https://harmonyos.51cto.com

1 簡介

在《OpenHarmony 源碼解析之JavaScript API框架(NAPI)》一文提到,NAPI就是L2設備上的 JS API實現方式。對OpenHarmony提供的NAPI的設計思想、編程原則、Sample源碼等已做說明,本文不再贅述。

NAPI機制在整個OpenHarmony系統中起著承上啟下的重要作用,而框架代碼中C實現的比例也很大,尤其是對接驅動這方面。

本文主要呈現的是NAPI之C接口的極簡方式實現范例,適合初學者了解打通NAPI流程。

1.1 UI架構相關系列

《OpenHarmony 源碼解析之ACE (JavaScript運行環境初始化)》

《OpenHarmony 源碼解析之JavaScript API框架(NAPI)》

《OpenHarmony 源碼解析之JavaScript API框架(NAPI-C接口)》

《OpenHarmony 源碼解析之JavaScript(文件管理API)》

1.2 OpenHarmony架構圖

#星光計劃2.0# OpenHarmony 源碼解析之JavaScriptAPI NAPI-C接口-鴻蒙HarmonyOS技術社區

1.3 NAPI概念回顧

NAPI在系統中位置示意圖如下:

 #星光計劃2.0# OpenHarmony 源碼解析之JavaScriptAPI NAPI-C接口-鴻蒙HarmonyOS技術社區

從圖中可以得出,NAPI就是JS與C/C++之間的調用方式。

1.4 NAPI 實現方式

OpenHarmony上NAPI實現方式有兩種,分別是:

  • NAPI之C接口
  • NAPI之C++接口

兩者的特點與區別見下圖:

#星光計劃2.0# OpenHarmony 源碼解析之JavaScriptAPI NAPI-C接口-鴻蒙HarmonyOS技術社區

2 NAPI之C接口

2.1 實現過程解析

2.1.1 編譯構建

  • 增加子系統

源碼/build/subsystem_config.json中增加子系統選項,如下所示:

  1. "sample": { 
  2.     "project""hmf/sample"
  3.     "path""foundation/sample"
  4.     "name""sample"
  5.     "dir""foundation" 
  6.   } 
  • 修改產品定義

源碼/productdefine/common/products/Hi3516DV300.json中增加part選項

  1. "sample:sample_show":{} 
  • 增加樣例ohos.build文件

源碼路徑新增/foundation/sample/sample_show/ohos.build文件,定義子系統為sample,組件為sample_show,文件內容如下:

  1.   "subsystem""sample",     
  2.   "parts": {     
  3.     "sample_show": {     
  4.       "module_list": [   
  5.         "//foundation/sample/sample_show/interfaces/kits/js/declaration:sample_show",               "//foundation/sample/sample_show/interfaces/kits/napi:napi_packages"
  6.       ]  
  7.     }    
  8.   }  
  • 增加樣例BUILD.gn文件

源碼路徑新增/foundation/sample/sample_show/interfaces/kits/napi/sample/sample_show/BUILD.gn文件,定義動態庫名稱為sample,對應的源文件為sample.cpp, 則生成的動態庫名為libsample.z.so,燒錄后可以到/system/lib/下找到對應的動態庫。

  1. ohos_shared_library("sample") { 
  2.     include_dirs = [] 
  3.     sources = [ 
  4.         "sample.cpp"
  5.     ] 

2.1.2 源碼編寫

  • 增加NAPI模塊sampleModule的注冊

通過Register()注冊后,sampleModule對應的NAPI接口才能被編譯到系統中,應用才能對接口進行調用。

  1. extern "C" __attribute__((constructor)) void Register()  
  2.     {    
  3.         napi_module_register(&sampleModule);     
  4.     } 
  • 新增模塊的定義

sampleModule全局變量定義了當前NAPI模塊對應的模塊名sample,以及當前模塊對外接口注冊函數SampleExport。

  1. static napi_module sampleModule = {  
  2.     .nm_version = 1,     
  3.     .nm_flags = 0,   
  4.     .nm_filename = nullptr,  
  5.     .nm_register_func = SampleExport,    
  6.     .nm_modname = "sample",  
  7.     .nm_priv = ((void*)0),   
  8.     .reserved = { 0 },   
  9. }; 
  • 新增模塊的對外接口

在模塊對外接口SampleExport中,增加NAPI接口定義,對于C語言的NAPI只需增加屬性即可napi_define_properties,不需要定義類。

  1. static napi_value SampleExport(napi_env env, napi_value exports) 
  2.     static napi_property_descriptor desc[] = { 
  3.         DECLARE_NAPI_FUNCTION("test", JSTest), 
  4.         DECLARE_NAPI_FUNCTION("onCallback", JSCallback), 
  5.     };     
  6.  
  7.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
  8.     return exports; 
  • 新增NAPI接口實現函數

樣例中增加了兩個接口,分別是:test、onCallback;

**test:**接口使用場景為JS調用C相關函數;

**onCallback:**接口使用場景為JS定義了一個回調函數JSFuncA,某個時機觸發后,通過C語言調用JSFuncA進行回調處理。

  1. DECLARE_NAPI_FUNCTION("test", JSTest), 
  2.   DECLARE_NAPI_FUNCTION("onCallback", JSCallback), 

2.2 接口解析

2.2.1 JS->C 接口解析

JS調用的C接口定義:function test(para1: number): void;

具體NAPI的實現如下:

  1. static napi_value JSTest(napi_env env, napi_callback_info info) 
  2.     { 
  3.     size_t argc = 1; //參數個數定義 
  4.     napi_value argv[argc]; 
  5.     napi_value thisVar = nullptr; 
  6.     void *data = nullptr; 
  7.  
  8.     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data)); 
  9.     NAPI_ASSERT(env, argc >= 1, "JSTest Wrong number of arguments"); //參數個數校驗 
  10.  
  11.     napi_value result = nullptr; 
  12.     napi_create_int32(env, 0, &result); 
  13.  
  14.     int cPara1; //定義接口入參對應的C語言變量 
  15.     for(size_t i= 0; i< argc; i++){ 
  16.  
  17.         //參數類型校驗 
  18.         napi_valuetype valueType = napi_undefined; 
  19.         napi_typeof(env, argv[i], &valueType);       
  20.         NAPI_ASSERT(env, valueType == napi_number, "JSTest Wrong argument type. Number expected for parameter 1."); 
  21.          
  22.         if(i== 0) { 
  23.             //JS參數轉換為C語言參數,打印其值 
  24.             napi_get_value_int32(env, argv[i], &cPara1); 
  25.             SAMPLE_LOG("JSTest cPara1 value = %{public}d!", cPara1); 
  26.          }else
  27.             SAMPLE_LOG("JSTest napi_get_value error!"); 
  28.             return result; 
  29.         } 
  30.      } 
  31.  
  32.     cFunction(cPara1); //調用框架層對應的c函數,C語言參數傳遞到對應的C語言函數中     
  33.     return result; 

2.2.2 C->JS 接口解析

C調用JS接口函數定義:function JSCallback(callback: Function): void;

入參即為JS的回調函數,實現如下所示:

  1. static napi_value JSCallback(napi_env env, napi_callback_info info) 
  2. {     
  3.  
  4.    size_t argc = 1; //參數個數定義 
  5.    napi_value argv[argc]; 
  6.    napi_value thisVar = nullptr; 
  7.    void *data = nullptr; 
  8. napi_ref CallbackRef; 
  9. napi_value jsObj, prop1, callback = nullptr; 
  10.  
  11.    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data)); 
  12.    NAPI_ASSERT(env, argc >= 1, "JSCallback Wrong number of arguments"); //參數個數校驗 
  13.  
  14.    napi_valuetype callbackType = napi_undefined; 
  15.    napi_typeof(env, argv[0], &callbackType); 
  16.    NAPI_ASSERT(env, callbackType == napi_function, "parameter 1 type mismatch"); //參數類型校驗,傳進來的須是函數類型 
  17.          
  18. napi_create_reference(env, argv[0], 1, &CallbackRef);  //創建引用 
  19. napi_get_reference_value(env, CallbackRef, &callback); //根據引用獲取回調函數callback 
  20.  
  21. int cPara = 1; 
  22. napi_create_object(env, &jsObj); //創建JS回調函數對應的參數對象 
  23. napi_create_int32(env, cPara, &prop1); 
  24. napi_set_named_property(env, jsObj, "prop", prop1); //設置JS參數對象屬性值   
  25.  
  26. napi_call_function(env, nullptr, callback, 1, &jsObj, &undefine); //使用生成的JS參數,調用對應的JS回調函數        
  27.  
  28.    napi_value result = nullptr; 
  29.    napi_get_undefined(env, &result); 
  30.    return result;  
  31.    } 

3 應用代碼示例

JS應用引用NAPI接口時,須先引用接口定義的對應模塊,才能進行接口的調用。示例如下:

  1. //此處庫名須與2.1.1.4 節BUILD.gn中定義的庫名一致 
  2.    import sample from '@ohos.sample'  
  3.    ...... 
  4.    onTest: function () { 
  5.       console.log("sample.test start"
  6.       sample.test(2); //JS調用napi接口  
  7.       console.log("sample.test end"
  8.    }, 
  9.    ...... 

4 總結

NAPI在OpenHarmony應用開發中必不可少,本文檔拋磚引玉介紹了NAPI之C語言接口的極簡實現方式,方便大家入門,后續隨著學習的深入將不斷完善對NAPI接口實現方式的解讀。

文章相關附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1550

想了解更多內容,請訪問:

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

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-12-08 15:07:51

鴻蒙HarmonyOS應用

2022-07-19 20:04:31

NAPI模塊鴻蒙

2021-09-16 15:08:08

鴻蒙HarmonyOS應用

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-05-12 14:42:17

項目開發Napi實現

2022-05-17 10:42:36

reboot源碼解析

2022-10-11 15:04:28

NAPI開發鴻蒙

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2022-07-05 16:03:29

電源管理子系統鴻蒙

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2022-06-13 14:18:39

電源管理子系統耗電量服務

2022-05-20 10:32:49

事件循環器事件隊列鴻蒙

2022-01-13 10:11:59

鴻蒙HarmonyOS應用

2021-08-30 18:09:57

鴻蒙HarmonyOS應用

2022-01-10 15:30:11

鴻蒙HarmonyOS應用

2023-04-12 15:31:11

系統服務管理鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色免费观看网站 | 97日日碰人人模人人澡分享吧 | 成年人黄色一级毛片 | 国产视频中文字幕 | 日韩视频在线观看中文字幕 | www.天堂av.com| 日韩第1页 | 丁香五月网久久综合 | 午夜精品一区 | 视频一区 国产精品 | 久久精品欧美一区二区三区不卡 | 久久蜜桃av一区二区天堂 | 免费看片国产 | 男女污污网站 | 女女百合av大片一区二区三区九县 | 99久久久久久久 | a级免费黄色片 | 精品网| 色av一区二区 | 天天综合久久 | 一级做a毛片 | 久久亚洲国产精品日日av夜夜 | 久久精品1 | av中文字幕在线 | 亚洲一区二区三区四区五区午夜 | 国产精品免费一区二区三区 | 国产99久久久国产精品 | 日日想夜夜操 | 久久精品亚洲精品 | 国产综合久久久 | 久久99精品久久久久婷婷 | 亚洲高清视频一区二区 | 免费成人av | 亚洲欧美视频一区二区 | 成人性视频免费网站 | 久久999 | 精品欧美一区二区在线观看视频 | 欧美黑人狂野猛交老妇 | 午夜在线免费观看 | 日本精品免费在线观看 | 久久伊人免费视频 |