HarmonyOS 鸿蒙Next中模拟器引入自编译的so库无法调用

HarmonyOS 鸿蒙Next中模拟器引入自编译的so库无法调用 我是把go的sdk交叉编译成so库后引入,编译了arm64和x86两个版本的so库,按官方教程配置,CMake编译通过且HAP包中以及包含了对应so库,但是模块一直加载失败。我尝试使用官方提供的demo:https://gitcode.com/HarmonyOS_Samples/NativeSoIntegration,在同一个模拟器上运行应用一直卡在首屏Hello World界面,无法看到计算页面。

请教一下各位大佬这个问题如何解决,API12,Deveco Studio6.0.2.640


更多关于HarmonyOS 鸿蒙Next中模拟器引入自编译的so库无法调用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

go 不直接支持 。 参考https://juejin.cn/post/7400961014051897379

更多关于HarmonyOS 鸿蒙Next中模拟器引入自编译的so库无法调用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


cgo编译后现在还是无法调用是吗,大佬有最新的稳定方案吗

建议仔细看文章和评论内容,上面都有写

感谢大佬,最后用ohos_golang_go在mac的模拟器上成功了

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

开发者你好,

为了进一步分析您的模块加载失败的原因,方便的话可以提供下您这边的可以复现的最小demo以便复现分析吗?请问下您这边加载模块失败时有具体的报错信息吗?有的话可以提供下报错日志吗?

https://gitcode.com/HarmonyOS_Samples/NativeSoIntegration

楼主运行demo一直显示Hello World是不是选错运行的模块了?选择了Multiply模块?应该运行entry模块的

是的,确实是这样我蠢了

在HarmonyOS Next中,模拟器调用自编译的so库失败,通常是由于ABI架构不匹配或库路径配置问题导致。请检查so库的编译目标架构是否与模拟器架构一致(如arm64-v8a),并确认库文件已正确放置在项目的libs目录对应子文件夹下。同时,需在模块的build-profile.json5中配置正确的nativeLibs路径,并确保在代码中通过System.loadLibrary正确加载。

根据你的描述,问题可能出在几个关键环节。核心是自编译的so库与HarmonyOS Next的NDK(Native Development Kit)环境存在兼容性问题。

  1. NDK版本与ABI兼容性:HarmonyOS Next的NDK是基于OpenHarmony的,其工具链(特别是bionic C库)与标准Android NDK有差异。你使用Go SDK交叉编译时,很可能链接的是Android或Linux的系统库,而非OpenHarmony的bionic库。这会导致so库在加载时因符号未定义或初始化失败而崩溃。请务必使用HarmonyOS NDK(在DevEco Studio的SDK Manager中下载)提供的工具链(如 clang)和sysroot来重新编译你的Go代码或C依赖库。

  2. 配置验证

    • CMakeLists.txt:确保 add_library 命令正确指向你的so文件,并设置了 SHARED 属性。同时,target_link_libraries 中应链接必要的HarmonyOS NDK库(如 libace_napi.z.so,如果你的Go库通过NAPI暴露接口)。
    • build-profile.json5:在对应模块的 buildOption 下的 externalNativeOptions 中,确认 abiFilters 包含了 arm64-v8a(对应ARM模拟器)或 x86_64(对应x86模拟器)。对于自编译的预构建库,通常需要在 ohos > cppLibs 下声明引入。
    • so库放置路径:预构建的so库应放在模块的 cpp 目录下,例如 src/main/cpp/libs/arm64-v8a/libxxx.so,并在CMake中通过 ${CMAKE_CURRENT_SOURCE_DIR}/libs/${OHOS_ARCH}/ 来引用。
  3. 运行卡顿分析:官方Demo在模拟器上卡在首屏,很可能是因为其内部加载so库失败,导致Native层初始化未完成,UI线程被阻塞。你可以通过 hdc shell 连接到模拟器,使用 hilog 命令查看应用日志,过滤 FFIdlopendlerror 或你的库名相关的错误信息,这是定位加载失败原因的最直接方法。

  4. Go特定注意事项:Go语言本身的运行时(runtime)和垃圾回收机制可能需要特定的初始化环境,这与HarmonyOS的Native环境可能存在冲突。考虑将核心逻辑用C接口封装,Go仅编译为静态库并与一个薄的C层(使用HarmonyOS NDK编译)链接,再由这个C层通过NAPI与ArkTS通信。这比让Go直接暴露动态库接口更可控。

建议你按以下步骤排查:

  • 使用HarmonyOS NDK重新编译生成so库。
  • 检查hilog日志,明确失败的具体错误码或信息。
  • 简化测试,先尝试一个纯C编写的、不依赖复杂运行时的简单so库(例如仅实现一个加法函数)是否能成功加载和调用,以隔离Go环境带来的问题。
回到顶部