当前位置: 首页 > 科技观察

跟着小白学鸿蒙——写一个NAPI子系统(七)

时间:2023-03-23 09:56:15 科技观察

想了解更多开源请访问:开源基础软件社区https://ost.51cto.com在《#跟着小白一起学鸿蒙#[六]第一个hap应用》,我们熟悉如何在开源的鸿蒙中开发hap应用。在后面的文章中,我们会在hap应用中编写系统库甚至动态库。在这篇文章中,我们主要是熟悉NAPI框架,一起写一个支持NAPI的子系统,方便我们以后在hap应用中方便的添加自己的功能。NAPI框架介绍NAPI(NativeAPI)组件是一套基于Node.jsN-API规范的具有对外接口的原生模块扩展开发框架。类似于Android的JNI,NAPI框架实现了应用层ts/ets/js语言编写的代码与开源的鸿蒙原生代码(c/c++)进行交互的能力。该框架由Node.jsN-API框架扩展。注:开源的鸿蒙标准系统使用NAPI框架,轻量级系统使用jerryscript框架。详细的内容介绍可以在以下链接查看官方说明:参考链接:https://gitee.com/openharmony/arkui_napi。NAPI使用graphLR创建d.ts-->执行napi_generator-->buildsubsystem-->importsubsystem-->编译生成d.ts:@ohos.napitest.d.ts,basic.d.ts。@ohos.napitest.d.ts是NAPI的声明文件,d.ts会在DevEcoStudio开发过程中用来检查语法和提供代码帮助。import{AsyncCallback}from'./basic';/***提供与napitest的接口。**@since7*/declarenamespacenapitest{/***关闭系统。**

此方法需要ohos.permission.SHUTDOWN权限。**@paramreason关机原因。*@systemapi*@since7*/functionshutdownDevice(reason:string):void;/***重启系统。**

此方法需要ohos.permission.REBOOT权限。**@paramreason重启原因。例如“updater”表示重启后进入updater模式*。如果不指定该参数,系统重启后进入正常模式。*@since7*/functionrebootDevice(reason:string):void;/***检查设备的屏幕是打开还是关闭。**@return如果屏幕打开则返回真;否则返回假。*@since7*/functionisScreenOn(callback:AsyncCallback<;布尔值>):无效;functionisScreenOn():Promise;}exportdefaultnapitest;basic.d.ts:一些基本方法的声明exportinterfaceCallback{(data:T):void;}exportinterfaceErrorCallback{(err:T):void;}exportinterfaceAsyncCallback{(err:BusinessError,data:T):void;}exportinterfaceBusinessErrorextendsError{code:number;}执行napi_generator创建文件夹,并将上面创建的两个d.ts和napi_generator放在一起。//准备环境mkdirnapitestcdnapitestvim@ohos.napitest.d.tsvimbasic.d.ts//复制napi_generatorcp[path]/napi_generator-linux.chmod+xnapi_generator-linux//生成napitest代码./napi_generator-linux-f@ohos.napitest.d.ts-oout//看到success表示烧录成功//查看out目录├──binding.gyp//工具中间文件├──BUILD.gn//需要以后使用gn文件├──napi_gen.log//工具日志├──napitest.cpp//自动生成接口调用实际代码├──napitest.h//自动生成接口调用实际代码├──napitest.cpp──napitest_middle。cpp//自动生成napi适配代码├──test.sh//生成js代码的脚本,官方没有给出解释,试过后不可用├──tool_utility.cpp//自动生成napi适配代码└──tool_utility.h//自动生成的napi适配代码建立子系统。在鸿蒙源码目录下创建foundation/napitest,将之前生成的文件复制到该文件夹??下。foundation├──ability├──ai├──arkui├──barrierfree├──bundlemanager├──communication├──deviceprofile├──distributeddatamgr├──distributedhardware├──filemanagement├──graphic├──multimedia├──多模式输入├──napitest│├──binding.gyp│├──BUILD.gn│├──bundle.json│├──napi_gen.log│├──napitest.cpp│├──napitest.h│├──napitest_middle.cpp│├──test.sh│├──tool_utility.cpp│└──tool_utility.h├──resourcesschedule在目录下创建bundle.json并使用内容。{"name":"@ohos/napitest","description":"napitestprovidesatomiccapabilities","version":"3.1","license":"ApacheLicense2.0","publishAs":"code-segment","segment":{"destPath":"foundation/napitest"},"dirs":{},"scripts":{},"component":{//部件名称"name":"napitest_interface",//子系统名称"subsystem":"napitest","features":[],"adapted_system_type":["standard"],"rom":"10000KB","ram":"10000KB","deps":{"components":["ace_napi","ipc_core","libhilog"],"third_party":["node"]},"build":{"sub_component":["//foundation/napitest:napitest"],"inner_kits":[{"header":{"header_base":"//foundation/napitest","header_files":["tool_utility.h","napitest.h"]},"name":"//foundation/napitest:napitest"}]}}}为了对应bundle.json,将BUILD.gn改成如下:import("//build/ohos.gni")ohos_shared_library("napitest"){sources=["napitest_middle.cpp","napitest.cpp","tool_utility.cpp",]include_dirs=[".","//third_party/node/src","//base/hiviewdfx/hilog/interfaces/native/innerkits/include",]deps=["//foundation/arkui/napi:ace_napi","//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",]remove_configs=["//build/config/compiler:no_rtti"]cflags=[]cflags_cc=["-frtti",]ldflags=[]relative_install_dir="module"//部件名称part_name="napitest_interface"//subSystemnamesubsystem_name="napitest"}importsubsystem添加子系统,修改build/subsystem_config.json。//文件后添加{//之前省略的内容...//添加新内容"napitest":{"path":"foundation/napitest","name":"napitest"}}添加编译入口(已经基于目前master版本,3.2)后编译路径有所改变。//修改vendor/hihope/[PRODUCT_NAME]/config.json文件,添加如下几行}]},编译生成。./build.sh--product-namePRODUCT_NAME//如果看到success,则编译成功。您可以通过findout/[PRODUCT_NAME]-name*napitest.z.so检查生成的文件。比如我的文件路径如下:./out/rk3568/lib.unstripped/napitest/napitest_interface/libnapitest.z.so./out/rk3568/napitest/napitest_interface/libnapitest.z.so./out/rk3568/innerkits/ohos-arm/napitest_interface/napitest/libnapitest。z.so./out/rk3568/packages/phone/system/lib/module/libnapitest.z.so//最后一个路径是系统镜像的路径,所以有两种方式//1,直接复制到/系统板/lib路径;参考《#跟着小白一起学鸿蒙# [二]第一个OpenHarmony程序》//2,烧图;参考《#跟着小白一起学鸿蒙# [一]运行OpenHarmony》总结一下,这样我们就有了自己的子系统和napi接口。在后面的章节中,我们会讲到如何在hap应用中调用系统库。参考链接:https://gitee.com/openharmony/napi_generator/tree/master。文章相关附件可点击下方原文链接下载:https://ost.51cto.com/resource/2308。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。