成都网站建设设计

将想法与焦点和您一起共享

go语言armv7a Go语言圣经

v7a软件和v8a软件的区别

v7a和v8a区别:

在莱山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、网站建设 网站设计制作按需定制设计,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,成都外贸网站建设,莱山网站建设费用合理。

armeabi默认选项,32位,支持基于ARM*v5TE的设备,支持软浮点运算(不支持硬件辅助的浮点计算),支持所有ARM*设备,armeabi-v7a32位,支持基于ARM*v7的设备,支持硬件FPU指令,支持硬件浮点运算。

armeabi-v8a64位,支持基于ARM*v8的设备,支持硬件FPU指令,支持硬件浮点运算不同手机由于cpu的不同,使用不同的驱动。

ABI:指应用基于哪种指令集来进行编译,ABI总共有四种,分别是armeabi、armeabi-v7a、mips、x86,它们都是表示cpu的类型。

为了减小apk体积,只保留armeabi和armeabi-v7a两个文件夹,并保证这两个文件夹中.so数量一致。

对只提供armeabi版本的第三方.so,原样复制一份到armeabi-v7a文件夹。

早期的Android系统几乎只支持ARMv5的CPU架构,现在支持7种!

Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年起),MIPS(从2012年起),ARMv8,MIPS64和x86_64(从2014年起),每一种都关联着一个相应的ABI。

应用程序二进制接口(ApplicationBinaryInterface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。

在Android系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

如何Golang开发Android应用

环境配置好复杂,我不得不唠叨几句。

需要下载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 example; echo "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语言怎么样?

Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。

Go是谷歌2009发布的第二款编程语言。2009年7月份,谷歌曾发布了Simple语言,它是用来开发Android应用的一种BASIC语言.

Go Logo

北京时间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手机存在的问题是,我们一直没有一个数学协处理器。"


当前文章:go语言armv7a Go语言圣经
转载来于:http://chengdu.cdxwcx.cn/article/doogieg.html