HarmonyOS 鸿蒙Next native c++ 工程如何引入so库

发布于 1周前 作者 yibo5220 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next native c++ 工程如何引入so库

native c++ 工程如何引入so库

参考官方教程NDK开发导读 (openharmony.cn)

  1. 创建NDK工程,选择NativeC++

  2. 构建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,就会自动签名。

  3. 代码开发

    工程里生成的napi.cpp,实现的是才c++层面接收ts的参数,完成直接相加,我们可以改成调用libadd.so的add函数来相加,实现调用第三方库。

    1. 在cpp文件夹下,新建include文件夹,放入add.h头文件

    2. 修改hello.cpp中的Add函数,调用add函数实现value0和 value1 相加,根据得到的cpp_sum,创建napi_value变量sum返回。

    3. Add的映射add函数工程中已经存在了,在index.d.ts中。当页面调用napi.add时,会把参数传给Add函数,经过转化,得到c++变量,经过计算,将结果又转成napi_value返回给页面。

    4. 改一下页面,点击”Hello World“,调用testNapi.add,将结果展示在页面上。

    可以运行看看效果。这样就实现了调用第三方库。

7 回复

感谢楼主分享,您这文章应该是个博客。

不过我有个疑问: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是已经存在的你要调用的第三方库。

有DEMO参考吗?
使用的openharmony源码里的编译器,所以重新编一下add.so库,这一步有教程吗,大佬
事实上你并没有在native模块中使用到你引入的`libadd.so`,你的桥接函数仍然是调用的系统生成的add函数,我在尝试引入预构建so库时发现,这样使用会导致挡墙的native模块变成undefined,无法使用

HarmonyOS 鸿蒙Next Native C++工程引入so库,需将so库文件放置在项目的libs目录下,并确保有对应架构的文件夹(如arm64-v8a、armeabi-v7a等)。然后,在CMakeLists.txt文件中添加so库的链接指令,注意库名前需加lib前缀。确保so库与项目的ABI设置兼容。如果库文件不兼容,需重新编译so库。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部