想要了解更多请访问:Harmonyos.51cto.com1文章中提到介绍《OpenHarmony 源码解析之JavaScript API框架(NAPI)》,NAPI是L2设备上的JSAPI实现。OpenHarmony提供的NAPI的设计思路、编程原理、Sample源码等均已说??明,本文不再赘述。NAPI机制在整个OpenHarmony体系中起着承前启后的重要作用,框架代码中C实现的比例也很大,尤其是在对接驱动方面。本文主要给出一个NAPI的C接口的最小实现实例,适合初学者了解NAPI流程。1.1UI架构相关系列《OpenHarmony 源码解析之ACE (JavaScript运行环境初始化)》《OpenHarmony 源码解析之JavaScript API框架(NAPI)》《OpenHarmony 源码解析之JavaScript API框架(NAPI-C接口)》《OpenHarmony 源码解析之JavaScript(文件管理API)》1.2OpenHarmony架构图1.3NAPI概念回顾NAPI在系统中的位置示意图如下:从图中可以看出NAPI是JS和C/C++之间的调用方式。1.4NAPI的实现方式OpenHarmony上有两种NAPI的实现方式,分别是:NAPI的C接口NAPI的C++接口的特点和区别如下图所示:2NAPI的C接口2.1实现过程分析2.1.1编译与编译buildaddsub在系统源码/build/subsystem_config.json中添加子系统选项,如下:"sample":{"project":"hmf/sample","path":"foundation/sample","name":"sample","dir":"foundation"}修改产品定义源码/productdefine/common/products/Hi3516DV300.json添加部分选项"sample:sample_show":{}添加示例ohos.build文件源码路径添加/foundation/sample/sample_show/ohos.build文件将子系统定义为sample,将组件定义为sample_show。文件内容如下:{"subsystem":"sample","parts":{"sample_show":{"module_list":["//foundation/sample/sample_show/interfaces/kits/js/declaration:sample_show""//foundation/sample/sample_show/interfaces/kits/napi:napi_packages",]}}}添加示例BUILD.gn文件源路径添加/foundation/sample/sample_show/interfaces/kits/napi/sample/sample_show/BUILD.gn文件,定义动态库名称为sample,以及对应的源码文本如果文件为sample.cpp,则生成的动态库名为libsample.z.so。烧录后在/system/lib/下可以找到对应的动态库ohos_shared_library("sample"){include_dirs=[]sources=["sample.cpp",]2.1.2source中添加NAPI模块sampleModule的注册代码编写通过Register()注册后,就可以将sampleModule对应的NAPI接口编译到系统中,应用程序可以调用该接口。extern"C"__attribute__((constructor))voidRegister(){napi_module_register(&sampleModule);}新建模块定义sampleModule全局变量定义了当前NAPI模块对应的模块名称sample,以及当前模块的对外接口注册函数SampleExport.staticnapi_modulesampleModule={.nm_version=1,.nm_flags=0,.nm_filename=nullptr,.nm_register_func=SampleExport,.nm_modname="sample",.nm_priv=((void*)0),.reserved={0},};对于新增模块的对外接口,在模块的对外接口SampleExport中添加NAPI接口定义。对于C语言的NAPI,只需要添加属性napi_define_properties,不需要定义类。staticnapi_valueSampleExport(napi_envenv,napi_valueexports){staticnapi_property_descriptordesc[]={DECLARE_NAPI_FUNCTION("test",JSTest),DECLARE_NAPI_FUNCTION("onCallback",JSCallback),};napi_define_properties(env,exports,sizeof(desc)[0]sizeof)(,desc);returnexports;}新增NAPI接口实现函数示例新增两个接口,分别是:test、onCallback;**test:**该接口的使用场景是从JS调用C相关函数;**onCallback:**该接口的使用场景为JS定义了一个回调函数JSFuncA。一定时机触发后,通过C语言调用JSFuncA进行回调处理。DECLARE_NAPI_FUNCTION("test",JSTest),DECLARE_NAPI_FUNCTION("onCallback",JSCallback),2.2接口分析2.2.1JS->C接口分析JS调用的C接口定义:functiontest(para1:number):void;具体的NAPI实现如下:staticnapi_valueJSTest(napi_envenv,napi_callback_infoinfo){size_targc=1;//参数个数定义napi_valueargv[argc];napi_valuethisVar=nullptr;void*data=nullptr;NAPI_CALL(env,napi_get_cb_info(env,info,&argc,argv,&this,&data));NAPI_ASSERT(env,argc>=1,"JSTestWrongnumberofarguments");//参数个数验证napi_valueresult=nullptr;napi_create_int32(env,0,&result);intcPara1;//定义C对应接口输入参数语言变量for(size_ti=0;i
