看到这个标题,你可能会问,为什么要在 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/spe