您现在的位置是:网站首页> Go语言
golang打包成android
- Go语言
- 2022-04-23
- 1422人已阅读
本文只讲述如果使用将golang工程打包成jar/aar/apk,适用于android开发者需要集成一些golang开发的微服务或者其他golang语言实现的功能。
环境安装
1. golang开发环境安装
安装包下载地址:下载,windows建议下载msi文件,直接安装之后环境变量都配置好了。 创建一个go的workspace,然后创建一个hello.go
//hello.go
//包名
package hello
//引入模块
import "fmt"
//main函数/程序入口
func main() {
fmt.Println("Hello, World!")
}
执行命令:go run hello.go
2. Android 开发环境安装
android studio 已默认安装了编译需要的ndk,但是路径并没有添加到path中,所以执行ndk-build时会提示找不到命令,这时只要找到ANDROID_SDK_ROOT/ndk和ANDROID_SDK_ROOT/ndk-bundle,将其添加到path中,这时的环境已经能满足下一步的要求了。
3. gomobile安装
要将go打包成aar/jar/apk以及IOS应用(需要xcode环境),则需要一个go的打包工具gomobile, 安装方式有两种
#方法1:
使用命令:`go get golang.org/x/mobile/cmd/gomobile`(需要翻墙)
#方法2:
#下载源码包:
git clone https://github.com/golang/mobile.git
#将源码拷贝到 $GOPATH/src/golang.org/x
#执行命令:
go build golang.org/x/mobile/cmd/gomobile
#这时会在C:\Users\username\go\bin下生成gobind和gomobile两个文件
#gomobile的初始化,
gomobile init
4. 打包示例
#将hello工程目录拷贝到C:\Go\src下面
#打包sdk
gomobile bind -target=android hello
#会在当前目录下生成hello.arr 和 hello.jar 两个sdk包
#打包apk
gomobile build -target=android hello
#会在当前目录下直接生成hello.apk
gomobile编译
(1.)下载代码,并生成二进制文件,gomobile和gobind
go get golang.org/x/mobile/cmd/gomobile
或者
git clone https://github.com/golang/mobile
copy到$GOPATH/src/golang.org/x/
//编译生成gobind二进制文件
cd mobile/cmd/gobind
go build .
拷贝gobind到$GOPATH/bin目录,并加入环境变量
//编译生成gomobile二进制文件
cd mobile/cmd/gomobile
go build .
拷贝gomobile到$GOPATH/bin目录,并加入环境变量
//查看是否安装成功
gomobile version
gomobile example测试
gomobile init
//此命令会生成名为basic的apk安装包
gomobile build -target=android golang.org/x/mobile/example/basic
//此命令将安装apk包到已连接的android设备
gomobile install golang.org/x/mobile/example/basic
//生成jar、aar文件
gomobile bind -target=android golang.org/x/mobile/example/bind/hello
或 D:\go\src\golang.org\x\mobile\example\bind>gomobile bind -target=android ./hello
gomobile example编译错误处理
配置环境变量
gomobile-ipfs编译
(1.)go代码中编译
代理路径: https://github.com/ipfs-shipyard/gomobile-ipfs
cd /go/bind/
gomobile bind -target=android ./ipfs
生成jar和aar文件
gomobile bind -target=android hello
生成hello.aar文件和hello-sources.jar文件,放到Android工程的libs目录里,aar文件供调用,source.jar可以看源码。
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package hello is a trivial package for gomobile bind example.
package hello
import "fmt"
func Greetings(name string) string {
fmt.Printf("hello go,this is log\n")
return fmt.Sprintf("Hello aaa, %s!", name)
}
func Test1(buf []byte) []byte{
fmt.Printf("in buf is:%x\n",buf)
outbuf := []byte{0x31,0x32,0x33,0x34}
return outbuf
}
然后应用里就可以很爽的调用:
/*
* Copyright 2015 The Go Authors. All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the LICENSE file.
*/
package org.golang.example.bind;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import hello.Hello;
public class MainActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.mytextview);
// Call Go function. test String
String greetings = Hello.greetings("Android and Gopher aaa11");
mTextView.setText(greetings);
// Call Go function. test byte[]
byte[] inbuf = new byte[6];
inbuf[0] = 0x39;
inbuf[1] = 0x38;
inbuf[2] = 0x37;
inbuf[3] = 0x36;
byte[] outbuf = Hello.test1(inbuf);
System.out.println(outbuf);
}
}
AndroidStdio的配置麻不麻烦呢?也不麻烦。配置下引用外部库即可。
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:22.1.1'
//implementation project(':hello')
implementation files('libs/hello.aar')
}
最后再来说下环境,也很简单,只需配置一次即可。
总结下:
直接用AndroidNDK编写SDK,需要自己写JNI。而gomobile一个命令,把脏活累活都给弄好了。
可以一份代码支持Android和iOS,维护上比较方便。
体积上,gomobile的so最起码有2.8MB,比C要大不少,也还能接受。因为效率高啊。
如果再有人找我封装JNI层的.so?我想,我想用go来做!
至于执行的效率,可反编译过来看下,其实内部还是调的c的JNI,只不过gomobile命令把这些繁琐的事做了。
效率应差不了多少。至于稳定性,虽然gomobile是谷歌内部的一个实验性项目,但是你只使用gobind做native层的工作,这部分已经很稳定了。
gomobile init之前需要环境变量中配置了ndk环境,可把ndk环境加到系统环境变量,或者通过ndk标签指定ndk目录gomobile init -ndk 指定。注意,要求ndk版本是在19以上才行
下一篇:Go经验总结