• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 在NDK工程中使用预构建库
2
3在NDK工程中,可以通过CMake语法规则引入并使用预构建库。在引用预构建库时,模块libs目录中的预构建库,以及在`CMakeList.txt`编译脚本中声明的预构建库都会被打包。
4
5## 预构建库使用约束
6
71.确保引入的SO动态库是通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译生成,如何通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译预构建库,请参照[CMake构建三方库适配流程](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-cmake-adapts-to-harmonyos#section1826019653918)8
92.确保引入的SO动态库的依赖库也导入到工程中且通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译生成。
10
11## 直接引入预构建库
12
13可以通过直接将预构建的库文件复制到项目文件中, 来使用预构建库。例如在项目中需要使用预构建库`libavcodec_ffmpeg.so`,其开发态存放路径如下图所示:
14
15![Snipaste_2023-10-30_14-39-27](figures/Snipaste_2023-10-30_14-39-27.png)
16
17在模块的`CMakeLists.txt`编译脚本中通过`add_library`添加所需的预构建库,并声明预构建库路径等信息后,可以在`target_link_libraries`中声明链接该预构建库,脚本示例如下所示:
18
19```cmake
20add_library(library SHARED hello.cpp)
21
22add_library(avcodec_ffmpeg SHARED IMPORTED)
23set_target_properties(avcodec_ffmpeg
24    PROPERTIES
25    IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/libs/${OHOS_ARCH}/libavcodec_ffmpeg.so)
26
27target_link_libraries(library PUBLIC libace_napi.z.so avcodec_ffmpeg)
28```
29
30在模块的`CMakeLists.txt`编译脚本中添加`include_directories`:
31
32```cmake
33include_directories(
34    ...
35    ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/include
36)
37```
38
39当在HAR中使用预构建库时,当前编译的库和链接所需预构建库会打包到HAR中的libs目录下,如下图所示:
40
41![zh-cn_image_0000001693795070](figures/zh-cn_image_0000001693795070.png)
42
43### 预构建库的SONAME问题
44
45请确保引入的预构建动态库(so)正确设置了`SONAME`。
46
47如果预构建so没有`SONAME`,链接器将会将so的绝对路径插入到依赖这个so的二进制文件的`dynamic section`中。当这些二进制文件随hap包发布运行时,动态加载器(`dynamic loader`)可能最终无法找到这个so而导致错误。
48
49可以使用`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`。
50示例如下:
51
52```bash
53> ${YOUR_PATH}/command-line-tools/sdk/default/openharmony/native/llvm/bin/llvm-readelf -d libavcodec_ffmpeg.so | grep SONAME
540x000000000000000e (SONAME)             Library soname: [libavcodec_ffmpeg.so]
55```
56
57若预构建so使用cmake进行构建,则所有的so默认会设置`SONAME`(只要目标平台支持)。
58若预构建so使用其他构建工具,可以通过配置`ldflags`来设置。
59
60```bash
61${...}/clang++ ${...} -Wl,-soname,libavcodec_ffmpeg.so
62```
63
64## 使用远程依赖HAR中集成的预构建库
65
66当使用远程依赖HAR中集成的预构建库时,`CMakeLists.txt`文件中引用脚本如下所示:
67
68```cmake
69set(DEPENDENCY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules)
70add_library(library SHARED IMPORTED)
71set_target_properties(library
72    PROPERTIES
73    IMPORTED_LOCATION ${DEPENDENCY_PATH}/library/libs/${OHOS_ARCH}/liblibrary.so)
74add_library(entry SHARED hello.cpp)
75target_link_libraries(entry PUBLIC libace_napi.z.so library)
76```
77
78## 使用本地HAR中集成的预构建库
79
80当使用本地HAR中集成的预构建库时,`CMakeLists.txt`文件中引用脚本如下所示:
81
82```cmake
83set(LIBRARY_DIR "${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/")
84add_library(library SHARED IMPORTED)
85set_target_properties(library
86    PROPERTIES
87    IMPORTED_LOCATION ${LIBRARY_DIR}/liblibrary.so)
88add_library(entry SHARED hello.cpp)
89target_link_libraries(entry PUBLIC libace_napi.z.so library)
90```
91