HarmonyOS 鸿蒙Next openharmony应用如何使用so库
HarmonyOS 鸿蒙Next openharmony应用如何使用so库
我有一个第三方的so库,我需要在应用中使用库中的函数。以下是我的代码目录
hello.cpp中使用了libHed_SDK.so库中的函数。
按照以上步骤执行后,报错
> 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库
对,在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 调用了.
没有,换成用静态库了
好的,谢谢
在HarmonyOS鸿蒙Next openharmony应用中,使用so库(共享对象库)通常涉及以下几个步骤:
- 确认so库兼容性:确保so库与HarmonyOS的架构(如arm64-v8a、x86_64等)兼容。若不兼容,需重新编译或适配。
- 放置so库:将so库文件放置在项目的指定目录下,如
src/main/resources/ability/native/
。 - 配置依赖:在项目的构建配置文件中(如CMakeLists.txt),配置对so库的依赖,并设置abiFilters以匹配目标架构。
- 加载so库:在代码中,使用
System.loadLibrary()
方法加载so库,库名应与放置在指定目录下的so库文件名一致(不包括前缀“lib”和后缀“.so”)。 - 调用so库函数:通过NAPI(Native Ability Programming Interface)或JNI(取决于具体版本)声明和调用so库中的函数。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。