需要注意该方案只能引用适配Native的so库,因此在编译生成so库时需要实现功能函数并向Napi注册其Native侧接口,提供对应的Native侧接口文件index.d.ts和配置文件oh-package.json5。在 HarmonyOS 中,如何理解这个概念?
在ArkTS侧引用三方so库
按照实际开发场景可分为两部分:生成适配Native的so库和在ArkTS侧引用so库。
第一部分:开发功能函数,编译生成so库并适配Native。具体操作可参考:使用命令行CMake构建NDK工程。
第二部分:在ArkTS侧通过配置模块动态依赖的方式引用so库。
通过配置模块动态依赖引用
实现原理
将so库和对应的Native侧接口文件加入到工程中,在工程中配置so库对应的模块动态依赖,在ArkTS侧通过import引入依赖接口调用so库。但是需要注意该方案只能引用适配Native的so库,因此在编译生成so库时需要实现功能函数并向Napi注册其Native侧接口,提供对应的Native侧接口文件index.d.ts和配置文件oh-package.json5。
在模块级oh-package.json5中声明乘法so库根目录路径。
{
// ...
"dependencies": {
// ...
// The declared dependency name should match the name of the referenced SO library
"libmultiply.so": "file:./src/main/cpp/types/libmultiply"
}
}
在ArkTS侧使用import引用oh-package.json5中声明的依赖并进行结果验证。
如何在同一个工程中实现三方so库的编译和引用
可以在工程中创建两个Module,通过其中一个Module编译生成加法、减法和乘法运算so库,通过另外一个Module引用三方so库,进行结果验证。
在集成三方so库时,.so库文件和.h头文件一定要置于上述方法的路径下吗
不一定。原则上.so库文件和.h头文件可以置于需要引用so库的工程目录的任意位置,但是需要在工程的CMakeLists.txt文件中修改文件配置。如:将add.h头文件和libnativeAdd.so库文件放置在entry的根目录下,需要在CMakeLists.txt文件中通过include_directories命令添加entry的根目录作为头文件路径,并修改target_link_libraries命令中需要预加载的加法so库的路径,才能保证so库链接成功。
代码示例
# src/main/cpp/CMakeLists.txt
include_directories(${NATIVERENDER_ROOT_PATH}/../../..)
target_link_libraries(entry PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libnativeAdd.so)
在纯ArkTS工程中如何引用三方so库
纯ArkTS工程可以通过配置模块动态依赖的方式引用so库。但是需要注意,在引用过程中除了将已经适配Native的xxx.so库文件置于entry/libs对应的架构目录下外,还需要将编译三方so库时配套产生的libc++_xxx.so库文件置于该目录下。