HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库

发布于:2025-05-22 ⋅ 阅读:(20) ⋅ 点赞:(0)

本指南基于笔者临时修复的 ohos_golang_go 项目fork,解决HO 应用导入 cgo编译产物时的 crash 问题。

1. 下载 ohos_golang_go

git clone https://gitcode.com/deslord/ohos_golang_go.git

📌 该仓库为笔者临时修复版本,修复了 CGO 编译模式下 HO 应用导入 Go 编译产物时的崩溃问题。


2. 下载 Go 1.20.7(或更高版本)

你可以进入 Go 官方下载页面 手动下载,或直接运行以下命令:

wget https://go.dev/dl/go1.20.7.linux-amd64.tar.gz
sudo tar -xzf go1.20.7.linux-amd64.tar.gz

3. 配置 GOROOT_BOOTSTRAP 环境变量

编辑 ~/.bashrc 文件:

vim ~/.bashrc

加入以下内容(假设解压目录为 /home/lxl/go):

export GOROOT_BOOTSTRAP=/home/lxl/go

保存后使配置生效:

source ~/.bashrc

4. 编译 ohos_golang

cd ohos_golang_go/src
./make.bash

5. 配置系统 Go 环境变量

编辑 ~/.bashrc 文件:

vim ~/.bashrc

加入以下内容(替换 <你的ohos_golang_go目录地址> 为实际路径):

export GOROOT=<你的ohos_golang_go目录地址>
export PATH=$GOROOT/bin:$PATH

保存后使配置生效:

source ~/.bashrc

6. 验证配置是否成功

运行以下命令检查:

which go
go env GOROOT
go version

确认输出路径和版本信息正确。


8. 应用编译

a. 安装 HarmonyOS ARM 编译工具

访问华为开发者联盟官网。

  1. 登录 华为开发者联盟(需注册账号)。
  2. 进入 “开发” > “下载”,查找 Command Line Tools 相关版本。
  3. 选择 Linux 版本(如 5.0.13.200)进行下载并解压:
unzip commandline-tools-linux-x64-5.0.13.200.zip
  1. 设置环境变量:
vim ~./bashrc
export AR=/xxx/command-line-tools/sdk/default/openharmony/native/llvm/bin/llvm-ar
export CC=/xxx/command-line-tools/sdk/default/openharmony/native/llvm/bin/aarch64-unknown-linux-ohos-clang
export CXX=/xxx/command-line-tools/sdk/default/openharmony/native/llvm/bin/aarch64-unknown-linux-ohos-clang++
export GOOS=openharmony
export GOARCH=arm64
export CGO_ENABLED=1

b. 使用 cgo 模式编译 .so 文件

go build -a -buildmode=c-shared -o libgoadd.so -x main.go

9. 引入so到HarmonyOS应用

接下来实战展示如何引入cgo到HarmonyOS应用,该流程与HarmonyOS-native一致
ps:如何引入三方so可参考官方文档
Native侧引用三方so库
demo代码的go部分(一个简单的add函数)如下:

package main

import "C"


//export GolangAdd
func GolangAdd(a, b C.int) C.int {
    return a + b
}
func main(){}

a. 编译产物拷贝

在这里插入图片描述

b. 编辑CMakeList.txt, 配置动态库链接

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

在这里插入图片描述

c.引用cgo方法

在这里插入图片描述

d.在arkts层调用native方法验证

在这里插入图片描述
在这里插入图片描述
demo代码参考