在Android中引用golang编译的aar包

gomobile是在安卓中使用golang的工程,既可以全部代码用golang,也可以引用部分golang的代码,但是现在还不成熟,还是试验阶段。
不过它不需要像C++那样去手动回收内存。

gomobile介绍wiki
https://github.com/golang/go/wiki/Mobile#sdk-applications-and-generating-bindings
gomobile地址
https://github.com/golang/mobile

支持的类型

  • Signed integer and floating point types.
  • String and boolean types.
  • Byte slice types. Note that byte slices are passed by reference,
    and support mutation.
  • Any function type all of whose parameters and results have
    supported types. Functions must return either no results,
    one result, or two results where the type of the second is
    the built-in 'error' type.
  • Any interface type, all of whose exported methods have
    supported function types.
  • Any struct type, all of whose exported methods have
    supported function types and all of whose exported fields
    have supported types.

https://godoc.org/golang.org/x/mobile/cmd/gobind

基本类型也就是

  • string(不支持string数组)
  • bool
  • int(java这边引用的时候会是long)
  • byte[]

传递返回值无法传递数组,可以将数据转成json格式然后通过string或者byte array传递过来,这边再解析。最好不要通过for循环频繁调用,因为他们之间的通讯是有代价的。

配置gomobile的环境

$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init # it might take a few minutes

最好将目录$GOPATH/bin加到环境变量,不然运行gomobile命令还需要进入到GOPATH/bin目录下。

如果go get不下来gomobile的话,可以将镜像工程:https://github.com/golang/mobileclone到GOPATH/src/golang.org/x目录下

gomobile init之前需要环境变量中配置了ndk环境,或者通过ndk标签指定ndk目录gomobile init -ndk ~/soft-code/android-ndk-r14b,试过经典的android-ndk-r10e会报一个pyton错误。

运行sample测试环境是否成功

使用android studio导入$GOPATH/src/golang.org/x/mobile/example/bind/android项目。

打开hello模块底下的build.gradle填充里面的目录

plugins {
    id "org.golang.mobile.bind" version "0.2.13"
}

gobind {
    /* The Go package path; must be under one of the GOPATH elements or
     a relative to the current directory (e.g. ../../hello) */
    pkg = "golang.org/x/mobile/example/bind/hello"

    /* GOPATH where the Go package is; check `go env` */
     GOPATH = "~/go"

    /* Absolute path to the go binary */
     GO = "/usr/local/bin/go"

    /* Optionally, set the absolute path to the gomobile binary if the
    /* gomobile binary is not located in the GOPATH's bin directory. */
//     GOMOBILE = "~/go/src/golang.org/x/mobile"
}
  • 需要修改几个变量,一个是GOPATH这个只需要写自己go env里的gopath就可以。
  • GO目录,其实就是go的安装目录,在mac下可以通过命令which go找到对应的安装路径。
  • 第三个GOMOBILE就是指gomobile可执行文件的路径,一般是在GOPATH/bin目录下。可以不用设置。(如果gomobile的目录在GOPATH里)

接下来编译运行对应的安卓工程应该就ok了,可以看到他在hello的model里有一个aar文件。

这里主要是将安卓工程和对应的go工程通过联系起来,方便开发,而不是每次改动go都需要重新生成aar,然后导入aar。这里通过这个配置每次编译运行安卓工程都会自动生成并且更新aar。

通过命令生成aar

有的时候可能就是想要一个aar,没必要建一个安卓工程配置各种东西。
这时候有一个go工程就好了,要把需要提供给外部使用的方法放到一个目录下,然后对外开放的方法设置为public的(方法名开头大写)。然后对这个目录运行gomobile bind命令

gomobile bind -target=android golang.org/x/mobile/example/bind/hello

这个命令会在当前运行的目录底下生成.aar好source.jar文件
这里的hello就是需要打包的go文件所在的目录。
需要注意的地方:

  • 后面的目录写从GOPATH/src后面开始就可以了,不要写绝对路径。
  • 不要写到文件名,写到文件名上一级的文件夹名称就可以了。他会把这个文件夹里所有的public方法都对外提供。

可能遇到的问题

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,426评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,687评论 2 59
  • 一,环境搭建 1、安装Go a. 下载地址为:https://golang.org/dl/ b. 这里下载到的版本...
    殇月123阅读 4,999评论 0 2
  • 在去年oracle和谷歌的官司告一段落,但是Android开发者仍急切谷歌能够想苹果一样,开发自己的编程语言进行A...
    Tenny1225阅读 6,809评论 3 10
  • 文| 夏喜冬 01 “我的意中人是个盖世英雄,有一天他会踩着七色云彩来娶我。” 曾经,《大话西游》中紫霞仙子对至尊...
    夏喜冬阅读 914评论 4 4