HarmonyOS鸿蒙NEXT中如何引用.so动态库

HarmonyOS鸿蒙NEXT中如何引用.so动态库

引用的方式方法是什么?

.so动态库需要使用哪个版本?Linux?Android?还是啥?(我没有.so库的源码)

如果我有源码的话,编译参数应该怎么选择?

5 回复

要用到NDK开发,需要用Native C++仓颉项目模板。NDK开发可以参考

类似问题解决方案

更多关于HarmonyOS鸿蒙NEXT中如何引用.so动态库的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我参考这个说明做了一些尝试,在DevEco中基于Native C++模板创建了个基本项目,一旦我在cmake中为entry添加了第三方.so文件的依赖,app跑起来就连模板自带的add都undefine了。可是编译过程是没有报错的。

而且从相关文档里我没找到关于平台参数的有关说明,目前我能确定的是应该采用ARM64-v8指令集的 .so 文件,可是操作系统应该用什么版本的呢?Linux? Android? 还是什么其它的类型?我不确定我的问题是不是因为我用错了 .so 版本。

在HarmonyOS NEXT中引用.so动态库,需在模块级build-profile.json5的buildOption字段配置externalNativeOptions:

"buildOption": {
  "externalNativeOptions": {
    "abiFilters": ["armeabi-v7a","arm64-v8a"],
    "cppFlags": "",
    "targets": ["your_lib_name"]
  }
}

将.so文件放置模块src/main/cpp/libs目录下,在CMakeLists.txt中添加:

add_library(your_lib_name SHARED IMPORTED)
set_target_properties(your_lib_name PROPERTIES IMPORTED_LOCATION
    ${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/libyour_lib.so)
target_link_libraries(your_entry SHARED your_lib_name)

在HarmonyOS NEXT中引用.so动态库的方法如下:

  1. 引用方式:
  • 将.so文件放入工程的libs目录下
  • 在模块的build-profile.json5中配置:
"buildOption": {
  "externalNativeOptions": {
    "targets": ["your_library_name"],
    "libraries": ["path/to/your_library.so"]
  }
}
  1. 版本要求: 必须使用专为HarmonyOS编译的.so库,Android或Linux版本的.so库不兼容。如果没有源码,需要联系库提供商获取HarmonyOS版本。

  2. 源码编译: 如果有源码,需要使用HarmonyOS NDK工具链编译:

  • 在CMakeLists.txt中设置:
set(CMAKE_TOOLCHAIN_FILE ${OHOS_NDK_HOME}/build/cmake/ohos.toolchain.cmake)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOHOS_STL=c++_shared")
  1. 运行时加载: 使用System.loadLibrary(“your_library_name”)加载库。
回到顶部