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

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.xdnf.cn/news/7875.html

相关文章:

  • 第二章:Android常用UI控件
  • Nova Launcher:个性化安卓桌面,打造专属体验
  • 通过AIoTedge或ThingsKit物联网平台内置的Node-RED读取OPC-UA
  • 并发编程中的对象组合的哲学
  • Spring Boot接口通用返回值设计与实现最佳实践
  • 破解充电安全难题:智能终端的多重防护体系构建
  • java面试每日一背 day1
  • 分布式集群中的共识算法及其在时序数据库IoTDB中的应用
  • [250521] DBeaver 25.0.5 发布:SQL 编辑器、导航器全面升级,新增 Kingbase 支持!
  • AI 模型高效化:推理加速与训练优化的技术原理与理论解析
  • Java多线程随笔
  • 03-Web后端基础(Maven基础)
  • C#实现自己的MCP Client
  • CSS、SCSS 和 SASS 的语法差异
  • 将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享
  • 07SpringMVC底层形象解析
  • 2022年下半年信息系统项目管理师——综合知识真题及答案(5)
  • 使用Vite创建一个动态网页的前端项目
  • 1.0 Epson数据类型以及函数的传值与传址
  • 微信小程序中,解决lottie动画在真机不显示的问题
  • CSDN gitcode代码推送
  • 博主总结框架
  • RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头
  • R语言学习--Day05--绘图技巧
  • .NET外挂系列:5. harmony 中补丁参数的有趣玩法(下)
  • 野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2
  • IP地址详解
  • vue调后台接口
  • 【5.19-5.26学习周报】
  • RPA浪潮来袭,职业竞争的新风口已至?