讨论广场 问答详情
将so库和对应的Native侧接口文件加入到工程中,在工程中配置so库对应的模块动态依赖,在ArkTS侧通过import引入依赖接口调用so库。这是为什么?有没有相关的演示代码帮我分析一下呢?
aurora6688 2026-08-23 01:04:08
42 评论 分享
harmonyos

需要注意该方案只能引用适配Native的so库,因此在编译生成so库时需要实现功能函数并向Napi注册其Native侧接口,提供对应的Native侧接口文件index.d.ts和配置文件oh-package.json5。在 HarmonyOS 中,如何理解这个概念?

42 评论 分享
写回答
全部评论(1)

在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库文件置于该目录下。

 

2026-08-23 01:05:25