您的位置:

golang安卓编译环境,golang编译后需要环境支持吗

本文目录一览:

如何用Go语言开发Android应用

Go 语言是一个试图结合动态类型和静态类型,编译效率和安全性以及语言的易用性等众多特性与一体的一种尝试。他的另一个目标是支持现代的基于网络的、基于多核的计算。最后,Go 还是非常快的,他可以在单个计算机上仅仅花费几秒时间构建一个庞大的应用程序。使用GO语言开发android语言步骤如下:

1. 下载安装Go语言(版本1.5+)

Golang链接

回到顶部

2. 下载安装 gomobile

下载

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

安装(需要等待几分钟)

gomobile init

回到顶部

3. Golang开发手机应用有两种方式

a. 原生应用开发

$ go get -d golang.org/x/mobile/example/basic

主要应用领域:

应用控制管理与配置

OpenGL ES 2 绑定

Asset 管理

Event 管理

试验中的包,含有OpenAL 绑定、音频、字体、图形以及运动传感器

Android开发

$ gomobile build -target=android golang.org/x/mobile/example/basic

此命令会生成名为basic的apk安装包

$ gomobile install golang.org/x/mobile/example/basic

此命令将安装apk包到已连接的android设备

android 可以用go 语言吗

Go语言将支持Android

概述

我们建议将Go语言引入Android平台,重点是用Go语言编写游戏程序,API将在Android NDK中定义。

背景

Android平台被设定为一个多应用操作系统,一个相对于传统UNIX系统来说更依赖于网络库和服务的操作系统,这意味着我们将为Go运行时开放更多的API。

将Golang带入Android平台是一件非常糟糕的事情,因为Android本身是Java构建的并且拥有巨量的API,任何试图将这些API用Go替代的结果将会导致一个非常糟糕的结果。无论是手工建立包装类还是自动建立都会导致程序运行非常缓慢。

然而如果使用基于C的API,通过AndroidNDK来编写一些游戏类程序可能会带来意想不到的收获。

提议

在Golang 1.4周期中,Android平台的编译将纳入Go的源,并且包含Android支持的cgo(由Elias Naur贡献)。Dalvik-loadable .so外部连接文件的支持也会由Android NDK提供。

在发布上我们仍然提供交叉平台编译,并且支持在Linux主机上adb工具在Android设备上测试程序。

我们将会提供一个名叫go.mobile的子版本,包含:

1、通过Android NDK对OpenGL,OpenSL和OpenMAX的支持。

2、一个Java-Go的工具,支持通过Java调用Go的Package,所以许多游戏的菜单UI可以通过标准SDK构建。(有可能会支持通过其他语言调用Go,比如Objective-C。)

3、集成AndroidStudio

新特性将会在Go1.4稳定版中提供。

如何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是脚本语言还是汇编?

go可以在安卓运行的,github.com/golang/mobile,这是用golang做移动端开发的库,

go是静态编译语言,不是脚本语言

golang安卓编译环境,golang编译后需要环境支持吗

2022-11-27
安卓golang,安卓golang编译器

本文目录一览: 1、Go语言能在安卓运行吗? Go是脚本语言还是汇编? 2、如何Golang开发Android应用 3、android 可以用go 语言吗 4、为什么Android不采用GoLang语

2023-12-08
安卓golang,安卓golang编译器

本文目录一览: 1、Go语言能在安卓运行吗? Go是脚本语言还是汇编? 2、如何Golang开发Android应用 3、android 可以用go 语言吗 4、为什么Android不采用GoLang语

2023-12-08
golang编译,golang编译dll

2022-11-27
golang写脚本解释器,golang编译原理

2022-11-26
golang安卓脚本,golang安卓程序开发

2022-11-27
golang三大基础,golang语言和go

2022-11-26
深入探究Golang编译器

2023-05-18
golang线上部署编译,golang 编译

2022-11-26
golang三大编译器,golang 高级编程

2022-11-28
golang编程从零开始,golang 高级编程

本文目录一览: 1、如何学习Golang? 2、怎样学习GO语言? 3、怎么学习golang 4、如何学习GO语言? 如何学习Golang? 想要成绩好?就看一看下面的题示吧!1、写作业时定下时间2、

2023-12-08
golang发布项目,golang开发环境

本文目录一览: 1、golang 微服务开发(一) 2、Golang项目部署3,容器部署 3、Golang入门到项目实战 | 第一个golang应用 4、如何部署Golang应用 5、golang适合

2023-12-08
golang支持跨平台吗,go语言怎么实现跨平台

2022-11-28
golang能链接硬件吗,golang 硬件

2022-11-27
golang&&,golang语言

2022-11-28
golang交叉编译详解

2023-05-18
golang项目编辑,golang 高级编程

2022-11-26
golang语法手册,golang运算符

2022-11-27
golang学习小组,golang 教程 pdf

2022-11-27
golang协程安全吗,go 协程通信

2022-11-27