-
Notifications
You must be signed in to change notification settings - Fork 3
Go mobile Android
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
需要SDK和NDK的支持才能进行编译,SDK和NDK可在.profile
中设置:
#go mobile
export ANDROID_HOME=$HOME/app/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/20.1.5948944
使用 NDK r20b 版本以获得良好兼容性.
重启系统让设置生效。
gomobile现在支持模块(go.mod), 不用再像以前只支持GOPATH, 需要手动把模块引用放到GOPATH中!
package hi
import (
"fmt"
"strings"
)
func Hi(name string) string {
fmt.Println("你好", name)
return strings.Join([]string{"你好", name}, ":")
}
go get -d golang.org/x/mobile/cmd/gomobile
gomobile bind -v -androidapi 21 -target=android -o hi.aar ./hi/
go get用于自动在go.mod中增加间接引用, 否则gomobile bind会报错, 最好每次执行gomobile bind前执行go get.
- 参考文档 以依赖项形式添加您的库 将上面生成的hi.aar添加到Android项目中.
- 调用
Hi.hi("小明")
,Run日志中可见Tag为GoLog的日志打印:"你好 小明".
https://github.com/alx696/go-mobile-android
测试发现http服务通过上面mobile的形式不能正常提供服务,但是用Termux运行GoLang可以,可能还能做更多的事情.
参考 https://dev.to/kataras/how-to-turn-an-android-device-into-a-web-server
访问 https://termux.com/ 从F-Droid下载并安装, 然后打开. 下面执行的命令都在Termux中.
$ pkg install golang
GoLang示例源码(main.go)如下:
package main
import (
"log"
"net/http"
)
func main() {
log.Println("web服务")
http.HandleFunc("/hi", func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(200)
writer.Write([]byte("你好"))
})
http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("/sdcard/Download"))))
http.ListenAndServe(":8090", nil)
}
按GoLang的源码结构创建lilu.red域, web工程. 将示例源码放到一个下载服务中, 然后使用wget下载到Android设备中:
$ mkdir -p $HOME/go/lilu.red/web
$ cd $HOME/go/lilu.red/web
$ wget http://下载服务地址/main.go
$ export GOPATH=$HOME/go
$ cd $HOME/go/lilu.red/web
$ go run main.go
在Android设备的浏览器中打开 http://127.0.0.1:8090, 或在与Android设备可以联通的局域网内其它设备浏览器中打开 http://android设备ip:8090. 此时网页中会显示Android设备的下载文件夹中的内容.
看起来Termux就是一个Linux! 如果不希望每次都以源码形式运行GoLang(每次都要设置GOPATH), 可以直接构建应用:
$ go build -o web main.go
然后将web移动到HOME中, 以后每次进入Termux后执行 ./web
就可以启动服务了.