HarmonyOS 鸿蒙Next Native C++ 引用第三方动态库无法运行

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

HarmonyOS 鸿蒙Next Native C++ 引用第三方动态库无法运行

- DevEco Studio 3.1.1 Release ,

- x86_64 模拟器.

创建Native C++项目, 默认代码 可以在模拟器上运行. 调用了 add方法.

在项目中 集成 opencv库

(使用 api 10 交叉编译链 编译的opencv库)

正常编译, 模拟器上运行崩溃掉.

cmake如下:

cke_4757.png

生成的hap包里面也有 opencv库

cke_12289.png

安装过程log:

cke_32997.png

运行报错:

cke_33843.png

哪怕hello.cpp里面不调用 opencv的代码,只在CMakeLists.txt 中链接 opencv 也是这个错误.

12 回复

我的问题与楼主的问题有几分类似,却又不同。

deveco 3.1.1 release

这是一个官网的demo,参见https://docs.openeuler.org/zh/docs/22.03_LTS_SP1/docs/Distributed/%E5%9F%BA%E4%BA%8E%E5%88%86%E5%B8%83%E5%BC%8F%E8%BD%AF%E6%80%BB%E7%BA%BF%E6%89%A9%E5%B1%95%E7%94%9F%E6%80%81%E4%BA%92%E8%81%94.html

可是我能编译通过,运行却报错:

cke_1015.png

cke_4160.png

求教

我和你的问题一样,即使放置在这个目录也会导致native模块在通过import加载时变成undefined

问题解决了, (经其他华为渠道解决了)

链接第三方动态库,

需要把 库放到entry/libs目录下,

cke_4000.png

CMakeListst中使用 绝对路径来链接.

target_link_libraries(entry PUBLIC  ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libopencv_world.so)

希望以后DevEco 能够优化这种小问题

厉害! 我当时直接编译静态库了

牛!我也碰到了,确实是这个原因!太坑了

后来研究发现, 只要链接了opencv_world库,哪怕 hello.cpp中不调用任何cv代码(也不包含都文件),

初始化"Init"和注册函数 "RegisterEntryModule" 都没有调用,

就是说  libentry.so没有load成功.


在继续发现,偶尔会又这个log

01-16 12:39:37.125 32678-4943/? W 03900/NAPI: [native_module_manager.cpp(LoadModuleLibrary)] dlopen failed: dlopen failed: library "C:/Users/XXXXDevEcoStudioProjects/NameExample/entry/src/main/cpp/opencv/OHOS-x86_64/libopencv_world.so" not found:\

 needed by /data/storage/el1/bundle/libs/x86_64/libentry.so in namespace arkUI_default

WOW! 天哪, libentry.so竟然要到  我桌面路径去加载 opencv库,当然加载不到了

使用objdump 查看path,

$ objdump -x libentry.so |grep PATH
  RUNPATH              C:/Users/XXXXX/DevEcoStudioProjects/NameExample/entry/src/main/cpp/opencv/OHOS-x86_64<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

然后通过CMake设置RPATH

set_target_properties(entry PROPERTIES LINK_FLAGS "-Wl,-rpath=$ORIGIN/")<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

通过objdump查看 是生效了(虽然还带着 C盘路径

$ objdump -x libentry.so |grep PATH
  RUNPATH              $ORIGIN/:C:/Users/XXXX/DevEcoStudioProjects/NameExample/entry/src/main/cpp/opencv/OHOS-x86_64<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

但运行还是崩溃

01-16 15:48:28.739 5077-15660/? W 03F00/ArkCompiler: [default] GetNativeModuleValue:153 GetNativeModuleValue: currentModule /data/storage/el1/bundle/entry/ets/modules.abcfind requireModule@app:com.example.nameexample/entry/entry failed

01-16 15:48:28.739 5077-15660/? D 03F00/ArkCompiler: [ecmascript] Throw error: Cannot read property add of undefined

01-16 15:48:28.739 5077-15660/? D 03F00/ArkCompiler: [ecmascript]     at anonymous (entry/src/main/ets/pages/Index.ets:55:51)

楼主 修改了绝对路径还是报错,你这边解决了么
可能是CMake版本的问题,使用工具链上的试试。
....模拟器啥时候支持api10了

opencv的交叉编译器 用的 10, 模拟器还是 DevEcho 默认安装的.

明白你说的了,用 api9 交叉编译器编译的opencv_world库同样的问题.

HarmonyOS 鸿蒙Next Native C++ 引用第三方动态库无法运行的问题,可能是由于多种原因导致的。首先,请确保第三方动态库与鸿蒙系统的兼容性,包括库文件的命名规则、版本号和依赖关系。其次,检查CMakeLists.txt文件中的链接设置,确保使用正确的路径和库名。如果问题依旧存在,可能是系统环境或编译器配置问题,建议详细检查开发环境配置。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部