更多内容请访问:Harmonyos.51cto.com,与华为官方共同打造的鸿蒙技术社区1.OpenHarmony的APP开发框架介绍是ACE,开发语言是JS/eTS。有时需要增加一些额外的功能,依赖已有的C/C++开源库,或者遇到一些CPU密集型计算场合,需要用C/C++语言为上层JS编写下层函数电话。OpenHarmony提供了统一的NAPI接口函数,方便通过编译系统的裁剪添加新的JS功能模块。本文以最简单的NAPI接口函数为例,详细讲解如何在OpenHarmony系统中编写模块文件、本地调试、系统集成、上机测试。1.1UI架构相关系列《OpenHarmony 源码解析之ACE (JavaScript运行环境初始化)》《OpenHarmony 源码解析之JavaScript API框架(NAPI)》?《OpenHarmony 源码解析之JavaScript API框架(NAPI实践)》《OpenHarmony 源码解析之JavaScript(文件管理API)》1.2OpenHarmony架构图1.3JSUI架构JSUI框架包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(PortingLayer),其架构如下图所示:2.快速实现模块目录的建立并编写基础编译文件模块目录理论上可以在OpenHarmony代码库的任意位置建立.为了书写方便,假设OpenHarmony代码库的目录为OHOS_SRC。在OHOS_SRC目录下,创建测试模块目录:myapp。此时在OHOS_SRC目录下应该有ark,foundation,device,...,myapp等目录,其中myapp是刚刚创建的,在myapp目录下,创建如下文件:|--BUILD.gn|--app.cpp|--ohos.buildBUILD.gn:import("//build/ohos.gni")ohos_shared_library("myapp"){#指定编译源文件sources=["app.cpp",]#指定编译依赖,如果依赖第三方库,需要添加deps=["//foundation/ace/napi:ace_napi"]#指定库生成的路径relative_install_dir="module"#子系统后面会引用它的组件subsystem_name="myapp"part_name="myapp_part"}最终会生成system/lib/module/libmyapp.z.so,在APP中:importmyappfrom'@ohos.myapp'这些myapp是所有统一名称:"module_list":["//myapp:myapp”]//myapp指的是myapp目录,:myapp指的是上面BUILD.gn中的目标ohos_shared_library("myapp")ohos.build:{"subsystem“:”我的应用程序“,”parts":{"myapp_part":{"module_list":["//myapp:myapp"],"test_list":[]}}}app.cpp:#include#include"napi/native_api.h"#include"napi/native_node_api.h"staticnapi_valueMethod(napi_envenv,napi_callback_infoinfo){napi_statusstatus;napi_valueworld;status=napi_create_string_utf8(env,"Hello,world!",13,&world);断言(status==napi_ok);returnworld;;napi_property_descriptordesc[]={DECLARE_NAPI_FUNCTION("hello",Method),};status=napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc);assert(status==napi_ok);returnexports;}NAPI_MODULE(myapp,Init)这里只是写了一个简单的JS模块,只有一个hello函数,return"Hello,world!"js。node--version在myapp目录下,创建一个test目录,然后写入binding.gyp和test.js文件:|--BUILD.gn|--app.cpp|--ohos.build`--test|--binding.gyp`--test.jsbinding.gyp:根据自己系统的实际情况,填写编译器、源代码(sources)、头文件目录(include_dirs)、依赖项(dependencies)、编译参数(cflags,cflags_cc),链接参数(link_settings:库)。这里的目标名称(target_name)就是接下来test.js引用测试的名称。{'targets':[{'cc':'clang','c++':'clang++','target_name':'test-native','sources':['../app.cpp'],'include_dirs':["/OHOS_SRC/foundation/ace/napi/interfaces/kits"],'dependencies':[],'cflags!':['-DTESTDEBUG','-std=gnu2x'],'cflags_cc':['-DTESTDEBUG','-std=c++17'],'link_settings':{'libraries':['']},}]}接下来,确保系统有node-gypnode-gyp--versioninstalledif如果没有安装系统,也可以暂时安装在test目录下。cdOHOS_SRC/myapp/testnpminstallnode-gyp./node_modules/.bin/node-gyp--version运行如下命令确保app.cpp文件没有语法错误,可以正确编译链接。如果在cdOHOS_SRC/myapp/testnode-gypconfigurenode-gypbuild之后修改了binding.gyp文件,需要重新构建node-gyp,test.js:varmyapp=require('./build/Release/test-native')console.log(myapp)console.log(myapp.hello)console.log(myapp.hello())如果编译正常,那么可以进行本地测试:nodetest.js4,集成到系统中,本地测试通过后,各种functionslooklike如果正常,那么就可以集成到OpenHarmony系统中,在电脑上烧录测试了。集成到OpenHarmony的步骤参考鸿蒙子系统的集成步骤:标准系统编译搭建指南这里简单说明一下:在OHOS_SRC/build/subsystem_config.json文件中,添加(注意前后逗号,并保持文件格式正确):"myapp":{"project":"hmf/myapp","path":"myapp","name":"myapp","dir":""}添加功能模块将以上子系统添加到产品配置中,编译成产品输出文件中(注意前后逗号,保持文件格式正确)OHOS_SRC/productdefine/common/products/productname.json"myapp:myapp_part":{}开始编译。./build.sh--product-nameproductname编译后在OHOS_SRC/out目录下可以找到生成的.so文件。root@1fe862aba551:/home/openharmony#findout-name'libmyapp*'out/ohos-arm-release/packages/phone/NOTICE_FILES/system/lib/module/libmyapp.z.so.txtout/ohos-arm-release/packages/phone/system/lib/module/libmyapp.z.soout/ohos-arm-release/lib.unstripped/myapp/myapp_part/libmyapp.z.soout/ohos-arm-release/myapp/myapp_part/libmyapp.z。所以图像输出在out/ohos-arm-release/packages/phone/images/目录中。5.第一次上机测试和提示写好后,需要烧录镜像文件。如果后面修改的话,可以使用hdc工具直接上传.so文件覆盖原文件即可。hdc.exefilesendlibmyapp.z.sosystem/lib/module/libmyapp.z.so写测试HAP:importmyappfrom'@ohos.myapp'exportdefault{testGetAppName(){console.log(myapp.hello())}}假设测试APP的包为com.example.testmyapp,可以使用hdc工具轻松安装、启动、关闭APP。安装:hdcinstall-r安装包的本地路径.hap卸载:hdcuninstallcom.example.testmyapp列出已安装的包:hdcshellbmdump-astart:hdcshellaastart-bcom.example.testmyapp-acom.example.testmyapp.MainAbilityshutdown:hdcshellkillallcom.example.testmyapphdc工具查看日志,只能根据进程号查看测试进程,更加清晰方便。:hdc.exeshellps-elf|grepcom.example.testmyapp#输出的第二列是pidhilog-Ppid#这里的pid就是上面第二列的数字。使用NAPI扩展来增强APP和补充JS的不足是非常方便的。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区