当前位置: 首页 > article >正文

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

本指南基于笔者临时修复的 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 mainimport "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代码参考

http://www.lryc.cn/news/2385292.html

相关文章:

  • Axure元件动作六:设置图片
  • 一体化雷达波明渠流量计简介
  • Pr -- 耳机没有Pr输出的声音
  • 白皮精读:2024年国家数据基础设施建设指引【附全文阅读】
  • 【信息系统项目管理师】第21章:项目管理科学基础 - 23个经典题目及详解
  • Mocha-Webpack 使用教程
  • AI硬件革命:OpenAI“伴侣设备”——从概念到亿级市场的生态重构
  • 穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A
  • 【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
  • 【C/C++】线程状态以及转换
  • 从零开始:Python语言进阶之异常处理
  • 关于vue彻底删除node_modules文件夹
  • 如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题?
  • 服务器硬盘虚拟卷的处理
  • 一个国债交易策略思路
  • Linux常用下载资源命令
  • Go语言爬虫系列教程(三)HTML解析技术
  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球
  • “夹子音”的发声原理和潜在风险
  • 思科硬件笔试面试题型解析
  • 手写ES6 Promise() 相关函数
  • Windows 平台 TCP 通信开发指南
  • 【NLP 76、Faiss 向量数据库】
  • 软件名称:系统日志监听工具 v1.0
  • Spring AI 之结构化输出转换器
  • Java虚拟机面试题:内存管理(上)
  • 进程间通信I·匿名管道
  • Ubuntu Linux系统的基本命令详情
  • 大数据治理:理论、实践与未来展望(二)
  • PCB布局设计