HarmonyOS:在NDK工程中使用预构建库

一、前言

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

二、直接引入预构建库

可以通过直接将预构建的库文件复制到项目文件中, 来使用预构建库。例如在项目中需要使用预构建库libavcodec_ffmpeg.so,其开发态存放路径如下图所示:

在模块的CMakeLists.txt编译脚本中通过add_library添加所需的预构建库,并声明预构建库路径等信息后,可以在target_link_libraries中声明链接该预构建库,脚本示例如下所示:

c 复制代码
add_library(library SHARED hello.cpp)


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)

在模块的CMakeLists.txt编译脚本中添加include_directories:

c 复制代码
include_directories(
    ...
    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/include
)

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

三、预构建库的SONAME问题

请确保引入的预构建动态库(so)正确设置了SONAME。

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

可以使用llvm-readelf工具查看so文件是否设置了SONAME。llvm-readelf工具路径为:{DevEco Studio安装目录}/sdk/default/openharmony/native/llvm/bin或者{command-line-tools安装目录}/sdk/default/openharmony/native/llvm/bin/llvm-readelf。

示例如下:

c 复制代码
> ${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]

若预构建so使用cmake进行构建,则所有的so默认会设置SONAME(只要目标平台支持)。

若预构建so使用其他构建工具,可以通过配置ldflags来设置。

c 复制代码
${...}/clang++ ${...} -Wl,-soname,libavcodec_ffmpeg.so

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

当使用远程依赖HAR中集成的预构建库时,CMakeLists.txt文件中引用脚本如下所示:

c 复制代码
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)

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

当使用本地HAR中集成的预构建库时,CMakeLists.txt文件中引用脚本如下所示:

c 复制代码
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)
相关推荐
HarmonyOS_SDK19 小时前
【HarmonyOS SDK Skills】挂载 Agent Skill,轻松跑通鸿蒙应用广告变现
harmonyos
闫东阳LordGalaxy20 小时前
给小艺装上数学能力:数易 App 接入智能体 FunctionComponent 与 A2A 双通路实战
harmonyos
Dream-Y.ocean21 小时前
鸿蒙PC平台逻控 PLC 编辑器适配实战:基于 Electron 壳方案的纯 JavaScript 梯形图编程与仿真引擎开发
javascript·编辑器·harmonyos
OH_TPC1 天前
HarmonyOS APP开发---"好物清单"购物清单App,需要用到这个库
harmonyos
贾伟康1 天前
【鸿蒙心迹】个人开发者上架复盘:备案、合规与审核指南没写透的细节
华为·harmonyos
不爱学英文的码字机器1 天前
2026鸿蒙远程控制软件完全选购指南:从入门到精通选型攻略
华为·harmonyos
贾伟康2 天前
【共创稿事节】HarmonyOS 7.0 BindContentCover全屏模态:从接入到生产验证
性能优化·实战·harmonyos·arkts·arkui
KevinChaos2 天前
声音明信片实验室 03|HarmonyOS 7.0 音频空间化:双版本试听无缝切换
harmonyos
贾伟康2 天前
【共创稿事节】HarmonyOS 7.0 Menu菜单与上下文:从接入到生产验证
性能优化·实战·harmonyos·arkts·arkui
行者-全栈开发2 天前
Flutter 插件 device_calendar_plus 开源鸿蒙适配实战:从权限弹窗失灵到循环日程跑通
flutter·跨平台·harmonyos·arkts·日历·适配·开源鸿蒙