Go 和 Android 集成实战

本文介绍如何在 Android 应用中使用 Go 代码,通过交叉编译 Go 为 Android 动态库,然后利用 JNA 在 Android 代码中调用。文中提供了一个简单的动态库示例,用于网站测速,详细讲解了从编写 Go 代码、交叉编译到 Android 代码集成的全过程。

看到这个标题,你可能会问,为什么要在 Android 中运行 Go,直接使用 Java 不挺好吗?

是的,如果你有现成很强大的 Java 团队,这没有问题,但并不是所有团队都是如此。而且我在这里想强调的是 Android 与 Go 的集合,即在 Android 程序中使用 Go 而不是完全用 Go 来写 Android 程序。

我能想到在 Android 中用 Go 的一些原因:

  • 团队熟悉 Go, 对 Java/Android 了解不多。
  • 已经有现成的 Go 核心代码,比如开源类库: libp2p,turn/stun 类库等。
  • 自己服务的 SDK 其核心逻辑复杂,繁琐,涉及大量网络或并发的操作。

能够在 Android 上使用 Go 代码,得益于 Go 强大的交叉编译能力,那该如何在 Android 上使用我们的 Go 库呢,接下来我将通过一个简单的示例来讲解。

实例教程

本例是在 Android 程序中使用 Go 编译的一个简单动态库来实现对网站测速的简单例子。

思路:

  • Go 交叉编译为 Android 平台支持的 so 文件。
  • 在 Android 中使用 JNA 调用该 so 文件。

依赖:

说明: 演示环境为 Mac。

编写 Go 测试代码

  • 编写 speedtester 的核心代码,实现对任意网站访问速度的检测:
package speedtester

import (
	"net/http"
	"time"
)

func Perform(url string) (int, error) {
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		return 0, err
	}

	startAt := time.Now()

	resp, err := http.DefaultClient.Do(req)
	cost := time.Now().Sub(startAt)
	if err != nil {
		return 0, err
	}
	defer resp.Body.Close()

	return int(cost / time.Millisecond), nil
}
  • 编写 CGO 代码,暴露一个 Perform API 函数:
package main

import "C"

import (
	"github.com/songjiayang/go-android/go/speedtester"
)

//export Perform
func Perform
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值