HarmonyOS 鸿蒙Next native c++ 工程如何引入so库
HarmonyOS 鸿蒙Next native c++ 工程如何引入so库
native c++ 工程如何引入so库
参考官方教程NDK开发导读 (openharmony.cn)
创建NDK工程,选择NativeC++
构建NDK工程
CmakeList.txt
教程中有对工程自动生成的Cmakelist的介绍,这里假设要使用一个名为add.so的动态库,里面定义一个add函数。
在CmakeList中添加add.so的链接,要把库的名字前加上lib,不然找不到库(不太清楚原因)。
build-profile.json5
在模块级build-profile.json5中,externalNativeOptions参数是NDK工程C/C++文件编译配置的入口,其中的abiFilters是设置本机的
ABI编译环境,我使用的是dayu200开发板,我这里设置为armeabi-v7a,如不配置该参数,编译时默认使用所有abiFilters。
设置好以后可以运行一下试试,发现报错
ld.lld: error: D:/DevEcoStudioProjects/ADD/entry/src/main/cpp/../../../libs/armeabi-v7a\libadd.so is incompatible with armelf_linux_eabi
意思是库文件与目标平台不匹配。目标平台(armv7a)使用的openharmony源码里的编译器,所以重新编一下add.so库,就可以了。
另外第一次运行还需要签名,连上开发板,在文件--项目结果--Signing Configs里,取消勾选Support HarmonyOS,就会自动签名。
代码开发
工程里生成的napi.cpp,实现的是才c++层面接收ts的参数,完成直接相加,我们可以改成调用libadd.so的add函数来相加,实现调用第三方库。
在cpp文件夹下,新建include文件夹,放入add.h头文件
修改hello.cpp中的Add函数,调用add函数实现value0和 value1 相加,根据得到的cpp_sum,创建napi_value变量sum返回。
Add的映射add函数工程中已经存在了,在index.d.ts中。当页面调用napi.add时,会把参数传给Add函数,经过转化,得到c++变量,经过计算,将结果又转成napi_value返回给页面。
改一下页面,点击”Hello World“,调用testNapi.add,将结果展示在页面上。
可以运行看看效果。这样就实现了调用第三方库。
感谢楼主分享,您这文章应该是个博客。
不过我有个疑问:add.so里面做了什么?第3点里面已经使用napi实现了libadd.so。 那第2点里面链接的add.so是另外要调用的吗?
同问,我也是没理解
假设你要调用的c++的第三方动态库是add.so,里面有一个add函数。在CMakeList里链接了这个你要调用的add.so,不过要写成libadd.so,这样这个CMakeList编出来就是一个libentry.so的库(假设你的native C++工程的名字是entry)。这样的话libentry.so应该是可以提供napi.add函数,当你在应用中调用napi.add时,就调用了hello.cpp的Add函数,接收传入的参数,将参数转成c++的数据类型,然后调用了add.so的函数实现加法,这就实现了在js调用c++的函数。 所以你说的"napi实现了libadd.so",我的理解你的意思是napi.cpp编出了libadd.so。但实际情况应该是libadd.so是已经存在的你要调用的第三方库。
HarmonyOS 鸿蒙Next Native C++工程引入so库,需将so库文件放置在项目的libs目录下,并确保有对应架构的文件夹(如arm64-v8a、armeabi-v7a等)。然后,在CMakeLists.txt文件中添加so库的链接指令,注意库名前需加lib前缀。确保so库与项目的ABI设置兼容。如果库文件不兼容,需重新编译so库。如果问题依旧没法解决,请加我微信,我的微信是itying888。