一步一步使用Android调用Golang

前提需要了解的

  1. 在Android中运行go代码,需要用到一个工具gomobile,后面会说到安装方式。

  2. Go开发环境,配置好GOPATH和GOROOT等。

  3. AndroidSDK和AndroidNDK

准备好Go代码

首先要准备好GO的开发坏境,并且配置好GOPATH,咱们的项目叫mobilego

mkdir code/mobilego
cd code/mobilego
echo export GOPATH=\$GOPATH:$(pwd) >> ~/.zshrc # .zshrc 为你的bash地址
source ~/.zshrc

其中code/mobilego是咱们go项目地址。那么现在就可以准备go代码了,那么我们可以按照这个样子新建一个项目。

mobilego
└── src
    └── mobile
        └── mobile.go

其中,src目录是必须要有的,因为gomobile需要从这个路径下查找包。其中mobile.go代码为:

package mobile

import "fmt"

func SayHello() {
      fmt.Println("Hello Mobile")
}

func SayHelloWithParams(name string) {
      fmt.Println("Hello", name)
}

func SayHelloWithParamsAndReturn(name string) string {
      return "Hello" + name
}

func SayHelloWithParamsAndReturnAndException(name string) (string, 
error) {
      return "Hello" + name, fmt.Errorf("some error")
}

这个mobile.go就是java和go文件通信的入口,其中gomobile会把这个文件的包名,编译成java对应符合java命名规范的类名(Mobile)。

mobile.go通过四个例子来演示java和go的通信。其中第一个无参数无返回值;第二个有参数无返回值;第三个有参数有返回值(同步返回);第四个有参数有返回值并且抛出一个异常。由于java不支持多返回值,如果go使用多个返回值的话,会报出错误。

准备gomobile

gomobile是一个可以为go编译成android和ios平台使用的工具,他的使用说明在https://github.com/golang/go/wiki/Mobile#tools可以找到。

  1. 首先下载这个工具
go get golang.org/x/mobile/cmd/gomobile

golang.org的代码基本上都托管在google服务器,一般来说在国内都不会下载成功的。那么只好换成另外一种下载方式。在这里,我们把golang.org/x/mobile/cmd/gomobile中的golang.org/x/换成github.com/golang/。如下所示:

go get github.com/golang/mobile/cmd/gomobile

这时候你会发现,这个包下载到了GOPATH/github.com下面了。我们要把它拷贝到golang.org目录下面

mv $GOPATH/src/github.com/golang/mobile $GOPATH/src/golang.org/x/mobile 

然后重新执行:

go get golang.org/x/mobile/cmd/gomobile

不出意外,gomobile已经安装完成了。执行gomobile version检查一下是否安装成功。

编译go代码

这一步要把go代码编译成Android平台使用的机器码。gomobile是一个非常好用的工具,通过一个命令不仅能把go代码编译成平台码,同时还会使用aar包来包装它,也就是说,我们完全不用写恶心的native代码了,直接调用gomobile生成的Java代码就好了。

首先来到go项目目录下面,执行gomobile编译命令。gomobile需要NDK,再次确定一下是否安装NDK。

gomobile bind -target=android mobile.go

mobile.go为入口文件。如果没什么问题的话,在项目目录下面就会多出两个文件。mobile.aarmobile-sources.jar。其中mobile.aar就是我们编译完成的文件。

Android调用Go

把上面的生成的mobile.aar拷贝到Android项目中的lib下面,同时修改build.gradle,在dependencies中加入或者修改一下代码,

默认值:

implementation fileTree(dir: 'libs', include: ['*.jar'])

修改后:

implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])

Sync一下工程,通过Java测试一下我们的go代码。

internal class RunTask : AsyncTask<Void, Void, Any?>() {

    override fun doInBackground(vararg params: Void): Any? {
        Mobile.sayHello()
        Mobile.sayHelloWithParams("lecon")
        val result = Mobile.sayHelloWithParamsAndReturn("spawn")
        Log.d("AndroidGo",result)
        try {
            Mobile.sayHelloWithParamsAndReturnAndException("liucl")
        } catch (e:Exception) {
            e.printStackTrace()
        }
        return null
    }
}

运行结果:

2019-04-18 13:31:04.566 7925-7982/? D/AndroidGo: Hellospawn
2019-04-18 13:31:04.571 7925-7982/? W/System.err:     at mobile.Mobile.sayHelloWithParamsAndReturnAndException(Native Method)
2019-04-18 13:31:04.590 7925-7987/? I/GoLog: Hello Mobile
2019-04-18 13:31:04.590 7925-7987/? I/GoLog: Hello lecon

这时候,你也许会发现,这几行代码的执行顺序是不确定的。因为java和go通信是跨进程调用,这几个方法有几个log是在go中输出,就不能保证执行顺序。

项目代码放到github上:https://github.com/leconio/AndroidCallGoDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266