HarmonyOS 鸿蒙Next openharmony应用如何使用so库

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next openharmony应用如何使用so库

我有一个第三方的so库,我需要在应用中使用库中的函数。以下是我的代码目录
cke_1675.png

hello.cpp中使用了libHed_SDK.so库中的函数。

cke_11886.png

按照以上步骤执行后,报错

> hvigor ERROR: ninja: Entering directory `D:\DevEcoStudioProjects\hello\entry.cxx\default\default\arm64-v8a’

[1/1] Linking CXX shared library D:\DevEcoStudioProjects\hello\entry\build\default\intermediates\cmake\default\obj\arm64-v8a\libentry.so

FAILED: D:/DevEcoStudioProjects/hello/entry/build/default/intermediates/cmake/default/obj/arm64-v8a/libentry.so 

cmd.exe /C “cd . && D:\HUAWEI\Sdk\openharmony\9\native\llvm\bin\clang++.exe --target=aarch64-linux-ohos --gcc-toolchain=D:/HUAWEI/Sdk/openharmony/9/native/llvm --sysroot=D:/HUAWEI/Sdk/openharmony/9/native/sysroot -fPIC -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,–noexecstack -Wformat -Werror=format-security   -D__MUSL__ -O0 -g -fno-limit-debug-info  --rtlib=compiler-rt -fuse-ld=lld -Wl,–build-id=sha1 -Wl,–warn-shared-textrel -Wl,–fatal-warnings -lunwind -Wl,–no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libentry.so -o D:\DevEcoStudioProjects\hello\entry\build\default\intermediates\cmake\default\obj\arm64-v8a\libentry.so CMakeFiles/entry.dir/hello.cpp.o  -lace_napi.z  -lm && cd .”

ld.lld: error: undefined symbol: api_sym_encrypt(uni_key_t*, alg_sym_param_t*, unsigned char const*, unsigned int, unsigned char*, unsigned int*)

>>> referenced by hello.cpp:88 (D:/DevEcoStudioProjects/hello/entry/src/main/cpp\hello.cpp:88)

>>>               CMakeFiles/entry.dir/hello.cpp.o:(Napi_sym_encrypt(napi_env__, napi_callback_info__))

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

ninja: build stopped: subcommand failed.

> hvigor ERROR: Failed :entry:default@BuildNativeWithNinja… 

> hvigor ERROR: Tools execution failed.

     Detail: Please check the message from tools.

> hvigor ERROR: BUILD FAILED in 1 s 330 ms 

Process finished with exit code -1

请问如何解决,怎样可以使用已有的so库

11 回复
楼主问题解决了么?能否提供一个样例?
请问楼主怎么解决的? 换静态库是把之前打给 Android 的 so 打成静态库了?

对,在entry目录下建一个libs目录,再建一个arm64-v8a目录,然后cmakelist里加

指定目标平台,这样用的就是arm64-v8a目录下的东西,我放的静态库。

set(CMAKE_CXX_FLAGS “–target=arm-linux-ohos”)

设置 用的库 的位置

LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/…/…/…/libs/arm64-v8a)

链接 库

target_link_libraries(entry PUBLIC libace_napi.z.so ${CMAKE_CURRENT_SOURCE_DIR}/…/…/…/libs/arm64-v8a/libxxx.a)

HarmonyOS的开发者模式提供了很多实用的工具,方便我们进行调试和优化。

求贴一个教程…我现在so已经有了,然后在libs下创建了对应目录,如何对标android 使用system.loadLibrary 调用了.

请问楼主解决了吗,有相同的问题

没有,换成用静态库了

对于OH,常规的解决方法是在系统里面把你的so库注册进去,按照JSI实现的方式去实现一下才能用。直接调用SO库应该只有java项目还是native项目才可以

在HarmonyOS鸿蒙Next openharmony应用中,使用so库(共享对象库)通常涉及以下几个步骤:

  1. 确认so库兼容性:确保so库与HarmonyOS的架构(如arm64-v8a、x86_64等)兼容。若不兼容,需重新编译或适配。
  2. 放置so库:将so库文件放置在项目的指定目录下,如src/main/resources/ability/native/
  3. 配置依赖:在项目的构建配置文件中(如CMakeLists.txt),配置对so库的依赖,并设置abiFilters以匹配目标架构。
  4. 加载so库:在代码中,使用System.loadLibrary()方法加载so库,库名应与放置在指定目录下的so库文件名一致(不包括前缀“lib”和后缀“.so”)。
  5. 调用so库函数:通过NAPI(Native Ability Programming Interface)或JNI(取决于具体版本)声明和调用so库中的函数。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部