需要下载golang1.4rc版,下载ndk,然后编译。 然后用go get 下载gobind这个工具, 然后,将写好的代码用gobind转化下,然后使用特殊的编译命令,将代码编译成.so文件,将生成的相关文件,放到android studio的项目中。然后java代码中,利用jni调用引用的代码。
... 好,接着往下看吧。
环境准备
一台Linux 64的机器
一个带有AndroidStudioIDE的开发机器
因为环境配置实在复杂,所以我们引入的docker。
docker pull codeskyblue/docker-goandroid
docker run --rm -ti codeskyblue/docker-goandroid bash
cd exampleecho "view example projects
docker起来之后,什么就都配置好了,NDK啦,java啦,GO的环境变量了,等等,并且还预装了vim,gradle,tmux,git,syncthing,svn
开始写代码
写代码之前,先约定下目录结构
go的代码都放在src/golib下,编译使用make.bash编译脚本,看下这个文件树
.
|-- app.iml
|-- build.gradle
|-- libs/armeabi-v7a # go编译生成的so文件
| `-- libgojni.so
|-- main.go_tmpl # 一个模板文件,先不用管它
|-- make.bash # 编译脚本,用来生成.so和Java代码
`-- src
|-- golib
| |-- hi
| | |-- go_hi�0�2�0�2�0�2 # 自动生成的代码
| | | `-- go_hi.go
| | `-- hi.go # 需要编写的代码
| `-- main.go
`-- main
|-- AndroidManifest.xml
|-- java
| |-- go # 自动生成的代码
| | |-- Go.java
| | |-- Seq.java
| | `-- hi
| | `-- Hi.java
| `-- me/shengxiang/gohello # 主要的逻辑代码
| `-- MainActivity.java
`-- res
我已经写了一个例子,先直接搞下来
编译下,试试行不行(就算不行问题应该也不大,因为大问题都被我消灭了)
cd GoHello/app
./make.bash
../gradlew build
一切顺利的话在build/outputs/apk下应该可以看到app-debug.apk这个文件。(剧透下,这个文件只有800多K)
编译好的我放到qiniu上了,可以点击下载看看
下面可以尝试改改,我抛砖引玉说下
打开hi.go这个文件
hi.go的内容,比较简单,我们写Go代码主要就是这部分
// Package hi provides a function for saying hello.
package hi
import "fmt"
func Hello(name string) {
fmt.Printf("Hello, %s!\n", name)
return "(Go)World"
}
文件末尾添加下面这行代码
func Welcome(name string) string {
return fmt.Sprintf("Welcome %s to the go world", name)
}
使用./make.bash重新编译下
打开MainActivity.java 修改下OnClickListener事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = Hi.Welcome("yourname")
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show()
}
})
编译运行下,把生成的apk安装到手机上试试。
原理解读(有兴趣的接着看)
首先说下gobind这个工具。
go_hi/go_hi.go这个文件时通过gobind这个工具生成的,用来配合一个简单的程序,生成.so文件
// go_hi.go
package go_hi
import (
"golang.org/x/mobile/bind/seq"
"example/hi"
)
func proxy_Hello(out, in *seq.Buffer) {
param_name := in.ReadUTF16()
hi.Hello(param_name)
}
func init() {
seq.Register("hi", 1, proxy_Hello)
}
这个简单的程序内容是这样的
// main.go
package main
import (
"golang.org/x/mobile/app"
_ "golang.org/x/mobile/bind/java"
_ "example/hi/go_hi"
)
func main() {
app.Run(app.Callbacks{})
}
src/MyActivity.java文件内容是这样的
import ...
import go.Go// 引入Go这个包
import go.hi.Hi// gobind生成的代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
Go.init(getApplicationContext())// 初始化两个线程
Hi.Hello("world")
}
}
其中有一句Go.init(...)这里再看go.Go这个包是什么样子的
public final class Go {
// init loads libgojni.so and starts the runtime.
public static void init(Context context) {
... 判断该函数是否该执行的代码 -- 省略 --
System.loadLibrary("gojni")// gojni需要这句
new Thread("GoMain") {
public void run() {
Go.run()// run()是一个native方法
}
}.start()
Go.waitForRun()// 这个也是一个native方法
// 这部分可以理解为,启动了一个后台线程不断的接收结果到缓存中。
new Thread("GoReceive") {
public void run() { Seq.receive()}
}.start()
}
private static boolean running = false
private static native void run()
private static native void waitForRun()
}
MyActivity.java中还有段代码是 Hi.Hello("world"),打开Hi.java路径在src/go/hi/Hi.java,这个文件也是gobind生成的,是用来给java方便的调用.so文件
// Hi.java
// File is generated by gobind. Do not edit.
package go.hi
import go.Seq
public abstract class Hi {
private Hi() {} // uninstantiable
public static void Hello(String name) {
go.Seq _in = new go.Seq()
go.Seq _out = new go.Seq()
_in.writeUTF16(name)
Seq.send(DESCRIPTOR, CALL_Hello, _in, _out)// 下面接着说
}
private static final int CALL_Hello = 1
private static final String DESCRIPTOR = "hi"
}
Seq.send这部分实际上最终调用的是一段go代码
func Send(descriptor string, code int, req *C.uint8_t, reqlen C.size_t, res **C.uint8_t, reslen *C.size_t) {
fn := seq.Registry[descriptor][code]
in := new(seq.Buffer)
if reqlen >0 {
in.Data = (*[maxSliceLen]byte)(unsafe.Pointer(req))[:reqlen]
}
out := new(seq.Buffer)
fn(out, in)
seqToBuf(res, reslen, out)
}
Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。Go是谷歌2009发布的第二款编程语言。2009年7月份,谷歌曾发布了Simple语言,它是用来开发Android应用的一种BASIC语言.
北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖。该奖项授予在2009年市场份额增长最多的编程语言。
谷歌资深软件工程师罗布·派克(Rob Pike)表示,"Go让我体验到了从未有过的开发效率。"派克表示,今天的C++或C一样,Go是一种系统语言。他解释道,"使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。"
2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%, 投入在该项目上。除了派克外,该项目的成员还有其他谷歌工程师也参与研发。
派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言。现有编程语言均未专门对多核处理器进行优化。Go就是谷歌工程师为这类程序编写的一种语言。它不是针对编程初学者设计的,但学习使用它也不是非常困难。Go支持面向对象,而且具有真正的闭包(closures)和反射 (reflection)等功能。
在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会 Go。之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如 Eclipse IDE中的插件。
在谷歌公开发布的所有网络应用中,均没有使用Go,但是谷歌已经使用该语言开发了几个内部项目。派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,还言之尚早,不过Go的确可以和Native Client配合使用。他表示"Go可以让应用完美的运行在浏览器内。"例如,使用Go可以更高效的实现Wave,无论是在前端还是后台。
Go 同时具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)。谷歌目前正在研发其对ARM芯片和Android设备的支持。派克表示,"Android手机存在的问题是,我们一直没有一个数学协处理器。"
这里介绍3种可以在手机上编程的app,分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python),都不需要root,可以直接编写程序并运行,下面我简单介绍一下这3个app的安装和简单使用,主要内容如下: 1.下载安装,这里以我的vivo手机为例,直接打开“应用商店”,搜索“C语言编译器”,如下,直接点击下载安装:测试代码如下,这里编写了2个函数,分别是2数之和和2数只差,很简单:程序运行截图如下,需要先输入2个数,才能正常运行:1.下载安装,这直接在应用商店里搜素“AIDE”就行,直接下载安装,如下: 这里测试一下,主要代码如下,官方自带的例子:程序运行截图如下:1.下载安装,这里直接在应用商店里搜索“QPython3”就行,直接下载安装,如下: 主界面如下,主要分为“终端”、“编辑器”、“程序”、“QPYPI”、“课程”、“社区”这6个模块,终端类似IDLE,编辑器类似记事本,QPYPI是第三方包和工具,程序存储官方自带的示例,课程是一些教学案例: 这里测试一下官方自带的例子—speaky.py,在“程序”这个模块下,代码如下: 点击运行按钮,程序运行截图如下: 至此,这3个app都介绍完毕。总的来说,使用起来都不错,各有各的功能,当然,还有许多其他的app也可以在手机上进行编程,像c4droid(c/c++),termux(高级终端,类似linux)等,这里我就不详细介绍了,感兴趣的可以在网上搜索一下,有相关教程和示例可供参考,希望以上分享的内容能对你有所帮助吧。 很高兴能回答你的问题 我就自己使用过的一些手机编程软件来进行说明。之前学习网页开发,为了让自己随时随地使用编程,携带方便。 第一种 html-css-js 这款软件,看着名字就知道是和html相关的网页开发,它是由踏宇 科技 开发的一款手机开发网页的APP。不仅有编程、编译功能,还可以进行网页开发学习,内附很多关于网页设计(css,js)。真正做到编写,学习两不误。这是代码编写界面: 这是学习界面: 但哎,我现在基本不使用它来编程了,当你使用到手机键盘里的,你就知道为啥了。 第二种,C++pro 这一款手持编程APP软件,是我比较喜欢的一款,功能很强大,不仅可以编写C语言、C++、C#而且还可以编写PHP、Nodejs、go等。可以说,你拥有了这一款APP,就相当于同时拥有了多个编程APP软件啦。 这是打开后的主界面。不难发现有很多种语言的编写模块。更加强大的是,它还可以在编写代码后做一个选择,选择要运行的语言工具。 当然如果大量代码运行的话,可能会比较迟缓。 两款手机编程APP分享给大家!这里介绍3种可以在手机上编程的app,分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python),都不需要root,可以直接编写程序并运行,下面我简单介绍一下这3个app的安装和简单使用,主要内容如下: 1.下载安装,这里以我的vivo手机为例,直接打开“应用商店”,搜索“C语言编译器”,如下,直接点击下载安装:测试代码如下,这里编写了2个函数,分别是2数之和和2数只差,很简单:程序运行截图如下,需要先输入2个数,才能正常运行:1.下载安装,这直接在应用商店里搜素“AIDE”就行,直接下载安装,如下:这里测试一下,主要代码如下,官方自带的例子:程序运行截图如下:1.下载安装,这里直接在应用商店里搜索“QPython3”就行,直接下载安装,如下:主界面如下,主要分为“终端”、“编辑器”、“程序”、“QPYPI”、“课程”、“社区”这6个模块,终端类似IDLE,编辑器类似记事本,QPYPI是第三方包和工具,程序存储官方自带的示例,课程是一些教学案例:这里测试一下官方自带的例子—speaky.py,在“程序”这个模块下,代码如下:点击运行按钮,程序运行截图如下:至此,这3个app都介绍完毕。总的来说,使用起来都不错,各有各的功能,当然,还有许多其他的app也可以在手机上进行编程,像c4droid(c/c++),termux(高级终端,类似linux)等,这里我就不详细介绍了,感兴趣的可以在网上搜索一下,有相关教程和示例可供参考,希望以上分享的内容能对你有所帮助吧。 用手机进行编程,也是脑洞大开了啊,不过话说回来,手机上到底能不能进行编程呢?当然是可以的,现在手机的性能可以说不亚于电脑的,那么我下面给大家分享几个用手机编程的办法。 1.c语言编译器 这个软件可以说是学习c语言的实用工具了,给大家介绍一下它的特点,就是小,没错内存只有10M左右,而且软件干净啊,使用起来没有什么广告,用起来效率也是非常高的。2.JAVA编辑器 如果你喜欢使用JAVA这个语言的话,这款软件留非常的适合你,专门做JAVA代码开发,你可以用它做一些小 游戏 ,功能非常的强大,而且使用的功能又很简单。可以在线编辑demo 跑基本环境 但是涉及到功能模块开发 还是需要电脑的, 手机只能简单编辑脚本 以及 代码的部分存储 坐公交坐地铁或排队等待的时候闲着没事可以在手机上编程学习,但是总得来说手机上编程不怎么舒适。第一款: pythonista3 phython编程app,特点:编写方便,交互感强,API强大 a.编辑器包含: 1. 语法高亮 2.自动补全符号 3.个性化python键盘 等功能b.清晰的标签,让你在各个文件间轻松切换!c.完美的提示窗口,手机上编写命令行也能从容自如d.方便的2d引擎库,快速写出一个小 游戏 吧第二款: mimo 学习编程app,特点:适合学习,操作简单,界面萌化 a.趣闻教学: 可以选择一门语言进行学习,内容非常易懂,操作也简单,mimo支持23种编程语言的教程,值得玩一玩。b.编辑也很方便第三款:my phython quiz 帮你复习python的app。 特点:碎片化学习 没事在路上多刷刷题吧,有助于增强熟练度。第四款: Udacity 目前最全,最优质的编程课程app。 特点:老师优质,硅谷资源,最新 科技 屏幕太小了,小心点眼睛。百度搜索以下软件,或者编程器 NO.1 c4droid 一款手机上的c语言编译器。 个人认为手机上最好用的,没有之一!c4droid是款Android设备上的C/C++程序编译器。 NO.2 AIDE 功能强大,内置学习教程。 AIDE是一个Android Java集成开发环境,可以让你在Android系统内进行Android软件和 游戏 的开发。 NO.3 我的应用iapp 专为手机研发,代码编写简单,学习容易。 iapp还很年轻,特别需要大家的支持! NO.4 cppdroid 和c4droid一样,是一款手机上的c语言编译器。 安卓上的C/C++编译环境,可以帮助你在手机上编写c/c++程序 ,和c4droid各有优点,cppdroid最大的优点就是可以即时报错,写一个字符就检查一遍,保证程序的正确性,而且编译速度快,虽然还有部分地方赶不上c4droid,但是和c4droid搭配还是不错的。 百度可以查查