当前位置: 首页 > news >正文

鸿蒙 NDK开发:使用预构建库(四)

在NDK工程中,可以通过CMake语法规则引入并使用预构建库。模块libs目录中的预构建库,以及在CMakeLists.txt中声明的预构建库都会被打包。

一、预构建库使用

约束说明
编译工具链确保引入的SO动态库是通过HarmonyOS NDK编译工具链生成的
依赖库确保引入的SO动态库的依赖库也导入到工程中,且通过HarmonyOS NDK编译工具链生成

二、直接引入预构建库

2.1 文件结构示例

预构建库文件存放路径示例:

entry/src/main/ ├── cpp/ │ ├── third_party/ │ │ └── FFmpeg/ │ │ ├── include/ # 头文件目录 │ │ └── libs/ # 库文件目录 │ │ ├── arm64-v8a/ │ │ │ └── libavcodec_ffmpeg.so │ │ └── armeabi-v7a/ │ │ └── libavcodec_ffmpeg.so │ └── CMakeLists.txt

2.2 CMakeLists.txt配置

# 添加源码产物 add_library(library SHARED hello.cpp) # 添加预构建库(IMPORTED表示预构建) add_library(avcodec_ffmpeg SHARED IMPORTED) # 设置预构建库的属性 set_target_properties(avcodec_ffmpeg PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/libs/${OHOS_ARCH}/libavcodec_ffmpeg.so ) # 声明链接该预构建库 target_link_libraries(library PUBLIC libace_napi.z.so avcodec_ffmpeg) # 添加头文件目录 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/include )

说明

  • add_library(avcodec_ffmpeg SHARED IMPORTED)IMPORTED表示这是预构建库,不需要编译

  • set_target_properties:设置IMPORTED_LOCATION属性指定库文件路径

  • ${OHOS_ARCH}:根据编译架构自动选择对应目录(arm64-v8a/armeabi-v7a等)

2.3 HAR中使用预构建库

当在HAR中使用预构建库时,当前编译的库和链接所需预构建库会打包到HAR中的libs目录下。

三、预构建库的SONAME问题

如果预构建SO没有设置SONAME,链接器将会将SO的绝对路径插入到依赖这个SO的二进制文件的dynamic section中。当这些二进制文件随HAP包发布运行时,动态加载器可能最终无法找到这个SO而导致错误。

检查SONAME

使用llvm-readelf工具查看SO文件是否设置了SONAME:

# 工具路径 ${DevEco Studio安装目录}/sdk/default/openharmony/native/llvm/bin/llvm-readelf # 示例命令 ${YOUR_PATH}/command-line-tools/sdk/default/openharmony/native/llvm/bin/llvm-readelf -d libavcodec_ffmpeg.so | grep SONAME # 正确输出示例 0x000000000000000e (SONAME) Library soname: [libavcodec_ffmpeg.so]

设置SONAME的方法

构建方式设置方法
CMake构建默认会设置SONAME(只要目标平台支持)
其他构建工具通过配置ldflags设置:clang++ ... -Wl,-soname,libavcodec_ffmpeg.so

四、使用远程依赖HAR中集成的预构建库

# 设置依赖路径 set(DEPENDENCY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules) # 添加预构建库 add_library(library SHARED IMPORTED) # 设置库文件路径 set_target_properties(library PROPERTIES IMPORTED_LOCATION ${DEPENDENCY_PATH}/library/libs/${OHOS_ARCH}/liblibrary.so ) # 链接到主产物 add_library(entry SHARED hello.cpp) target_link_libraries(entry PUBLIC libace_napi.z.so library)

路径说明../../../oh_modules是远程依赖HAR在工程中的默认存放位置。

五、使用本地HAR中集成的预构建库

# 设置本地HAR库路径 set(LIBRARY_DIR "${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/") # 添加预构建库 add_library(library SHARED IMPORTED) # 设置库文件路径 set_target_properties(library PROPERTIES IMPORTED_LOCATION ${LIBRARY_DIR}/liblibrary.so ) # 链接到主产物 add_library(entry SHARED hello.cpp) target_link_libraries(entry PUBLIC libace_napi.z.so library)

六、核心点

要点说明
预构建库声明add_library(库名 SHARED IMPORTED)
路径设置set_target_properties+IMPORTED_LOCATION
架构区分使用${OHOS_ARCH}变量区分不同架构
SONAME要求预构建SO必须设置SONAME,否则运行时可能加载失败
打包范围libs目录中的预构建库和CMakeLists.txt中声明的都会被打包

路径类型

路径类型说明示例
本地预构建库工程内直接引用${CMAKE_CURRENT_SOURCE_DIR}/libs/${OHOS_ARCH}/xxx.so
远程HAR依赖通过ohpm依赖的HAR${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/xxx/libs/${OHOS_ARCH}/xxx.so
本地HAR依赖本地HAR的构建产物${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/
http://www.jsqmd.com/news/1072755/

相关文章:

  • 从 RAP Managed 到 Unmanaged,ABAP Cloud 事务模型里的责任分界线
  • 【Ai运维】Redis008篇
  • Linux环境下部署Zookeeper3.9.5(最新版)集群部署
  • TVA在机电产品视觉检测的创新应用(13)
  • 怎么跟 AI 说话才能让它写出你要的代码——我和 Claude Code 的配合心法
  • HoRain云--Flutter状态管理全景指南2026
  • MAX API v1.0.2 界面重构、后台优化、安全加固
  • 浏览器跨域Cookie安全解决方案
  • 5G NR LDPC编译码
  • 告别重复造轮子:C#抽象机器人控制层,兼容ABB/安川/发那科
  • 政府采购不能要求本地机构?但可以这样要求!
  • 工作3年才敢说真话:90%的Java微服务项目,根本没必要用SpringCloud
  • 办公重复活自动干,OpenClaw 2.7.9 本地智能体真实使用体验
  • Python之stubsplit包语法、参数和实际应用案例
  • HarmonyOS 6 UIAbility跨设备连接详解(分布式软总线运用)
  • Kimi LeetCode 3347. 执行操作后元素的最高频率 II C语言实现
  • 第六章—18—数据容器的通用操作
  • HarmonyOS 6商城开发学习:平板竖屏下的底部“飞件“事故——用 layoutWeight 替掉 position 与 Stack 的响应式救火
  • 2026-06-23:合并靠近字符。用go语言,现有仅含小写字母的字符串s与整数k,规则说明如下: 1. 判定标准:同一字符串里,若两个相同字母的位置索引差值不超过k,这两个字符视作相邻靠近字符。 2
  • [C++]错误码与Try-catch
  • 【第十期】高级进阶篇:自动化与智能化 —— 如何用 Python 和 AI 辅助挖掘漏洞?
  • 项目实训(十一)| 学习路线模块:个性化学习路线生成
  • CAN↔CAN / CAN↔ETH转发到底怎么做?为什么说PduR是“所有通信流量的十字路口”?
  • Linux下的Codex辅助编程
  • 【Linux】进程控制(四)—— 手搓自主shell
  • 【Linux基础】Linux 必学基础指令:echo/cat/ 重定向 / 查找命令全解析
  • 线上Java服务凌晨3点告警,我靠这张排查流程图5分钟解决了故障
  • 阿里通义千问,8元叠加券,真的可以领到,真没有套路,真不用拉人头,实打实的,就是这么简单!
  • 代理IP为什么会被封?从访问行为看风控逻辑
  • 国内热门的AI智能体小程序哪家可靠