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

三方库移植之NAPI开发(三)通过IDE开发NAPI项目

时间:2023-03-12 10:40:20 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com在NAPI开发一文中三方库移植[1]—HelloOpenHarmonyNAPI,作者开发了一个rom包的napi项目。本项目需要编译烧录固件,C++动态库会集成到开发板的ROM中。在本文中,作者使用移植NAPI开发的第三方库HelloOpenHarmonyNAPI[1]中的helloonapi.cpp和index.ets的相同源码,通过IDE(集成)开发RAM包NAPI工程C++动态库到开发板RAM),直接编译安装hap包到开发板。两种开发方式的hap包运行效果相同。开发环境:IDE:DevEcoStudio3.0Release开发板:润和DAYU200开发板创建工程打开IDE,创建NativeC++工程。SDK选择API9,模型选择Stage。源码实现新建的NativeC++工程默认有helloworld教程,需要编辑的文件如下:C++方法实现将默认的hello.cpp文件重命名为helloapi.cpp,右键选择Refactor,改名。helloapi.cpp内容如下:#include"napi/native_api.h"#include//接口业务实现C/C++代码//std::string需要引入字符串头文件,#includestaticnapi_valuegetHelloString(napi_envenv,napi_callback_infoinfo){napi_value结果;std::stringwords="你好OpenHarmonyNAPI";//NAPI_CALL(env,napi_create_string_utf8(env,words.c_str(),words.length(),&result));napi_create_string_utf8(env,words.c_str(),words.length(),&result);返回结果;}//napi_addon_register_func//2.指定注册对外接口处理函数的模块。具体扩展接口声明staticnapi_valueregisterFunc(napi_envenv,napi_valueexports){staticnapi_property_descriptordesc[]={//声明napi_module提供的具体外部API{"getHelloString",nullptr,getHelloString,nullptr,nullptr,nullptr,napi_default,空指针}};//NAPI_CALL(env,napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc));napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc);rreturnexports;}//1.首先定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体的扩展接口在这个函数中声明//nm_modname:模块名,对应eTS代码为importnm_modnamefrom'@ohos.ohos_shared_library_name'//例子对应的eTS代码为:importhellonapifrom'@ohos.hellonapi'staticnapi_modulehellonapiModule={.nm_version=1,.nm_flags=0,.nm_filename=nullptr,.nm_register_func=registerFunc,//模块对外接口注册函数.nm_modname="hellonapi",//自定义模块名.nm_priv=((void*)0),.reserved={0},};//3。模块定义完成后,调用NAPI提供的模块注册函数napi_module_register(napi_module*mod)函数在系统中注册//注册模块,设备启动时自动调用此构造函数,模块定义的模块为在系统中注册extern"C"__attribute__((constructor))voidhellonapiModuleRegister(){napi_module_register(&hellonapiModule);}此时native_api.h文件在sdk\native\3.2.7.5\sysroot\usr\include\napi目录。CMakeLists.txt编译配置文件编写开发rom包的NAPI工程需要在BUILD.gn文件中指定编译so库所需的头文件与源文件、动态库名称、依赖库相同。通过IDE开发ROM包时也需要在CMakeLists.txt中指定编译so库所需的头文件和源文件、动态库名称、依赖库。内容如下:cmake_minimum_required(VERSION3.4.1)project(MyApplication3)set(NATIVERENDER_ROOT_PATH${CMAKE_CURRENT_SOURCE_DIR})include_directories(${NATIVERENDER_ROOT_PATH}${NATIVERENDER_ROOT_PATH}/include)add_library(helloapiSHAREDUBhellonapi.cpp)target_link_piraries(libace_napi.z.so)NATIVERENDER_ROOT_PATH路径指的是sdk\native\3.2.7.5\pponSHapi\usradd_li)表示编译libhellonapi.so需要hellonapi.cpptarget_link_libraries(helloapiPUBLIClibace_napi.z.so)表示编译编译libhellonapi.so依赖在libace_napi.z.so上开发ROM包的NAPI工程,libhellonapi.z.so也依赖libace_napi。z.so,下面是开发ROM包的NAPI工程时依赖的BUILD.gn文件libhellonapi.so所依赖的libace_napi.z.so,在sdk\native\3.2.7.5\sysroot\usr\lib\aarch64-linux-ohos目录。sdk\native\3.2.7.5\sysroot\usr\lib\arm-linux-ohos目录下还有一个动态库,开发ROM包的NAPI时可以依赖。编写index.d.ts声明文件,index.d.ts内容如下:exportconstgetHelloString:()=>string;三方库移植的接口设计index.ets和NAPI开发[1]—HelloOpenHarmonyNAPI与文中一致。从'@system.prompt'导入提示从'libhellonapi.so'@Entry@ComponentexportstructHelloNAPI{build(){Flex({direction:FlexDirection.Column,alignItems:ItemAlign.Center,justifyContent:FlexAlign.Center}){Button("NAPI:hellonapi.getHelloString()").margin(10).fontSize(24).onClick(()=>{//调用getHelloString接口letstrFromNAPI=hellonapi.getHelloString()prompt.showToast({message:strFromNAPI})})}.width('100%').height('100%')}}json配置文件写入package.json内容如下:{"name":"libhellonapi.so","types":"./index.d.ts"}entry/package-lock.json内容如下:"@types/libhellonapi.so":"file:./src/main/cpp/types/libhellonapi"如果有出错,删除原来的libentry.so符号链接。entry/package.json的内容如下:"@types/libhellonapi.so":{"version":"file:src/main/cpp/types/libhellonapi",修改原来的libentry,将libhellonapi的hap设置为automaticallysignhappackage运行效果与三方库移植之NAPI开发[1]—HelloOpenHarmonyNAPI一文效果一致。总结:RAM包的NAPI工程和ROM包的NAPI工程的异同。库libhellonapi.so,ROM包的NAPI工程编译使用的动态库为libhellonapi.z.so。libhellonapi.so位于hap包源码路径如下:entry\build\default\intermediates\libs\default\arm64-v8aentry\build\default\intermediates\cmake\default\obj\arm64-v8aentry\build\default\intermediates\libs\default\armeabi-v7aentry\build\default\intermediates\cmake\default\obj\armeabi-v7a开发ROM包的NAPI工程需要加入OHOS编译系统,写入BULID.gn、ohos.build等.,开发过程比较繁琐。RAM包的NAPI工程无需加入OHOS编译系统,编写CMakeLists.txt配置编译所需的源文件、头文件、依赖库。因此,开发RAM包的NAPI项目比较简单。.d.ts声明文件由作者在开发不同ROM包的NAPI项目时写的@ohos.hellonapi.d.ts内容,和作者在开发NAPI时写的@ohos.hellonapi.d.ts内容projectsforRAMpackagesFor:在写.d.ts声明文件时,RAM包开发的NAPI工程定义了函数方法getHelloString:()=>stringhasmore=>symbolsthanROMpackage。以下知识点附在开发ROM包的NAPI工程中,需要在sdk中添加声明文件模板。@ohos.modulename.d.tsfile:/***moduledescription*@sinceAPI版本号,ITRelease3对应4,依此类推*@sysCap系统能力*@devices支持设备*@import导入模块*@permission权限列表*/declarenamespacemodulename{//definefunctionmethodhere}exportdefaultmodulename;相关文章可点击以下链接下载:https://ost.51cto.com/resource/2351。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。