OpenHarmony 源码解析之JavaScriptAPI-NAPI 实践

开发 前端
本文以最简单的NAPI接口函数为例,详细说明在OpenHarmony系统如何编写模块文件、本地调试、系统集成、上机测试。

[[439364]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

1、简介

开源鸿蒙(OpenHarmony)的APP开发框架是ACE,开发语言是JS/eTS。有时候需要增加一些额外功能,依赖现有的C/C++ 开源库,或者遇到一些CPU密集计算的场合,就需要使用C/C++ 语言来编写更底层的函数,供上层JS调用。

OpenHarmony提供了统一的NAPI接口函数,通过编译系统的裁剪,方便增加新的JS功能模块。

本文以最简单的NAPI接口函数为例,详细说明在OpenHarmony系统如何编写模块文件、本地调试、系统集成、上机测试。

1.1 UI架构相关系列

  • 《OpenHarmony 源码解析之ACE (JavaScript运行环境初始化)》
  • 《OpenHarmony 源码解析之JavaScript API框架(NAPI)》
  • 《OpenHarmony 源码解析之JavaScript API框架(NAPI-C接口)》
  • 《OpenHarmony 源码解析之JavaScript API框架(NAPI实践)》
  • 《OpenHarmony 源码解析之JavaScript(文件管理API)》

1.2 OpenHarmony架构图

#星光计划2.0# OpenHarmony 源码解析之JavaScriptAPI-NAPI实践-鸿蒙HarmonyOS技术社区

1.3 JS UI架构

JS UI框架包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(Porting Layer),其架构如下图所示:

#星光计划2.0# OpenHarmony 源码解析之JavaScriptAPI-NAPI实践-鸿蒙HarmonyOS技术社区

2、快速实现

建立模块目录,编写基础编译文件

模块目录理论上可以建立在OpenHarmony代码库的任何地方,为行文方便,假设OpenHarmony代码库的目录为OHOS_SRC,在OHOS_SRC目录下,建立此次测试模块目录:myapp。

此时,OHOS_SRC目录下应该有 ark, foundation, device, …, myapp 等目录,其中myapp就是刚刚建立的,在myapp目录下,建立以下文件:

  1. |-- BUILD.gn 
  2. |-- app.cpp 
  3. |-- ohos.build 

BUILD.gn:

  1. import("//build/ohos.gni"
  2.    ohos_shared_library("myapp") { 
  3.      # 指定编译源文件 
  4.      sources = [ 
  5.        "app.cpp"
  6.      ] 
  7.      # 指定编译依赖,如果依赖第三方库,需要在此添加 
  8.      deps = [ "//foundation/ace/napi:ace_napi" ] 
  9.      # 指定库生成的路径 
  10.      relative_install_dir = "module" 
  11.      # 子系统及其组件,后面会引用 
  12.      subsystem_name = "myapp" 
  13.      part_name = "myapp_part" 
  14.    }    

 最终会生成system/lib/module/libmyapp.z.so,并且在APP中:import myapp from '@ohos.myapp'

这几处的myapp都是统一名称:

  1. “module_list”: [ “//myapp:myapp” ] 

//myapp指的是myapp目录,:myapp指的是上面BUILD.gn中的目标ohos_shared_library("myapp")

ohos.build:

  1.   "subsystem""myapp"
  2.   "parts": { 
  3.     "myapp_part": { 
  4.       "module_list": [ 
  5.         "//myapp:myapp" 
  6.       ], 
  7.       "test_list": [ ] 
  8.     } 
  9.   } 

app.cpp:

  1. #include <assert.h> 
  2.  
  3. #include "napi/native_api.h" 
  4. #include "napi/native_node_api.h" 
  5.  
  6. static napi_value Method(napi_env env, napi_callback_info info) { 
  7.   napi_status status; 
  8.   napi_value world; 
  9.   status = napi_create_string_utf8(env, "Hello, world!", 13, &world); 
  10.   assert(status == napi_ok); 
  11.   return world; 
  12.  
  13. static napi_value Init(napi_env env, napi_value exports) { 
  14.   napi_status status; 
  15.     napi_property_descriptor desc[] = { 
  16.         DECLARE_NAPI_FUNCTION("hello", Method), 
  17.     }; 
  18.   status = napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
  19.   assert(status == napi_ok); 
  20.   return exports; 
  21.  
  22. NAPI_MODULE(myapp, Init) 

这里只简单写了一个JS模块,只有一个hello函数,返回"Hello, world!"字符串。

3、本地测试

利用 node-gyp进行本地测试,先确保系统安装了node.js。

  1. node --version 

在myapp目录下,建立test目录,然后编写binding.gyp和test.js文件:

  1. |-- BUILD.gn 
  2. |-- app.cpp 
  3. |-- ohos.build 
  4. `-- test 
  5.     |-- binding.gyp 
  6.     `-- test.js 

binding.gyp:

按自己系统的实际情况,填写编译器、源代码(sources)、头文件目录(include_dirs)、依赖库(dependencies)、编译参数(cflags、cflags_cc)、链接参数(link_settings: libraries)。

这里的目标名称(target_name)就是下一步test.js引用测试的名称。

  1.   'targets': [ 
  2.     { 
  3.       'cc''clang'
  4.       'c++''clang++'
  5.       'target_name''test-native'
  6.       'sources': [ '../app.cpp'], 
  7.       'include_dirs': ["/OHOS_SRC/foundation/ace/napi/interfaces/kits"], 
  8.       'dependencies': [], 
  9.       'cflags!': [ '-DTESTDEBUG''-std=gnu2x' ], 
  10.       'cflags_cc': [ '-DTESTDEBUG''-std=c++17' ], 
  11.       'link_settings': { 
  12.           'libraries': [''
  13.       }, 
  14.     } 
  15.   ] 

接下来,确保系统安装了node-gyp

  1. node-gyp --version 

如果系统没有安装,那么在测试目录下临时安装也是可以的。

  1. cd OHOS_SRC/myapp/test 
  2. npm install node-gyp 
  3. ./node_modules/.bin/node-gyp --version 

运行如下命令,确保app.cpp文件无语法错误,可以正确通过编译链接。

  1. cd OHOS_SRC/myapp/test 
  2. node-gyp configure 
  3. node-gyp build 

 之后如果修改了binding.gyp文件,需要node-gyp rebuild,

test.js:

  1. var myapp = require('./build/Release/test-native'
  2. console.log(myapp) 
  3. console.log(myapp.hello) 
  4. console.log(myapp.hello()) 

 如果编译正常,那么就可以进行本地测试了:

  1. node test.js 

4、集成

集成到系统,在本地测试通过后,各种功能看起来正常,那么就可以集成到OpenHarmony系统,烧录上机测试了。

集成到OpenHarmony的步骤参考鸿蒙子系统的集成步骤:标准系统编译构建指导

这里简单描述一下:

在OHOS_SRC/build/subsystem_config.json文件中,增加(注意前后逗号,保持文件格式正确):

  1. "myapp": { 
  2.     "project""hmf/myapp"
  3.     "path""myapp"
  4.     "name""myapp"
  5.     "dir""" 

 在产品配置中添加上述子系统的功能模块,编译到产品产出文件中(注意前后逗号,保持文件格式正确)

  1. OHOS_SRC/productdefine/common/products/产品名称.json 
  1. “myapp:myapp_part”:{} 

即可开始编译。

  1. ./build.sh --product-name 产品名称 

编译完成后,可以在OHOS_SRC/out目录找到生成的.so文件。

  1. root@1fe862aba551:/home/openharmony# find out -name 'libmyapp*' 
  2. out/ohos-arm-release/packages/phone/NOTICE_FILES/system/lib/module/libmyapp.z.so.txt 
  3. out/ohos-arm-release/packages/phone/system/lib/module/libmyapp.z.so 
  4. out/ohos-arm-release/lib.unstripped/myapp/myapp_part/libmyapp.z.so 
  5. out/ohos-arm-release/myapp/myapp_part/libmyapp.z.so 

 镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下。

5、上机测试及小技巧

第一次编写完成后,需要烧录镜像文件。之后再修改,就可以利用hdc工具,只上传.so文件覆盖原文件即可。

  1. hdc.exe file send libmyapp.z.so system/lib/module/libmyapp.z.so 

编写测试HAP:

  1. import myapp from '@ohos.myapp' 
  2. export default { 
  3.   testGetAppName() { 
  4.     console.log(myapp.hello()) 
  5.   } 

假设测试APP的包是com.example.testmyapp,可以使用hdc工具很方便进行的安装、启动、关闭APP等操作。

安装:

  1. hdc install -r 安装包的本地路径.hap 

卸载:

  1. hdc uninstall com.example.testmyapp 

列出已经安装的包:

  1. hdc shell bm dump -a 

启动:

  1. hdc shell aa start -b com.example.testmyapp -a com.example.testmyapp.MainAbility 

关闭:

  1. hdc shell killall com.example.testmyapp 

hdc工具查看日志,可以根据进程号只看测试进程的,这样就更清晰方便了。:

  1. hdc.exe shell 
  2. ps -elf |grep com.example.testmyapp # 输出的第二列是pid 
  3. hilog -P pid #这里的pid是上面第二列的数字 

6、小结

OpenHarmony系统的ACE框架已经具备了基础的APP功能,可以很方便的利用NAPI扩展来增强APP,补充JS的不足之处。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-12-06 06:19:03

鸿蒙HarmonyOS应用

2021-09-16 15:08:08

鸿蒙HarmonyOS应用

2022-07-19 20:04:31

NAPI模块鸿蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鸿蒙

2022-05-17 10:42:36

reboot源码解析

2022-06-13 14:18:39

电源管理子系统耗电量服务

2021-11-25 09:54:54

鸿蒙HarmonyOS应用

2022-01-06 16:17:58

鸿蒙HarmonyOS应用

2022-07-05 16:03:29

电源管理子系统鸿蒙

2021-09-18 14:40:37

鸿蒙HarmonyOS应用

2021-11-08 15:04:47

鸿蒙HarmonyOS应用

2022-02-17 20:57:07

OpenHarmon操作系统鸿蒙

2021-12-17 16:42:09

鸿蒙HarmonyOS应用

2022-05-20 10:32:49

事件循环器事件队列鸿蒙

2022-10-11 15:04:28

NAPI开发鸿蒙

2022-01-20 14:33:29

openharmonwayland协议鸿蒙

2021-08-30 18:09:57

鸿蒙HarmonyOS应用

2023-04-12 15:31:11

系统服务管理鸿蒙

2022-01-10 15:30:11

鸿蒙HarmonyOS应用

2024-01-03 15:41:49

点赞
收藏

51CTO技术栈公众号