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是靜態編譯語言,不是腳本語言

原創文章,作者:ATIV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/149289.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ATIV的頭像ATIV
上一篇 2024-11-04 17:50
下一篇 2024-11-04 17:50

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 如何部署一個服務到一個環境

    本文將從多個方面對如何部署一個服務到一個環境進行詳細的闡述,包括環境準備、代碼編寫、打包部署等。 一、環境準備 1、確定部署環境的操作系統版本、運行時環境(如JDK、Node.js…

    編程 2025-04-29
  • Python開發環境包括

    Python作為一門高效、易讀易學的語言,已經被越來越多的開發者使用。而Python的開發環境也發展得越來越完善。本文將會從以下幾個方面對Python開發環境包括做詳細的闡述: 一…

    編程 2025-04-29
  • 內核驅動編譯環境代價分析

    內核驅動編譯環境是在Linux系統中編譯內核模塊的過程。本文通過分析內核驅動編譯環境的各個方面,包括編譯工具的選擇、編譯速度、編譯器選項等,來探討其代價所在,並提供一些優化的建議。…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • 如何使用cmd激活python虛擬環境

    Python虛擬環境是Python用來隔離項目所需包和依賴庫的工具,以免不同項目之間的依賴關係衝突。下面將從安裝虛擬環境、創建虛擬環境、激活虛擬環境這3個方面來詳細講解如何在cmd…

    編程 2025-04-28
  • Apache配置Python環境

    Apache是一款流行的Web服務器軟件,事實上,很多時候我們需要在Web服務器上使用Python程序做為數據處理和前端網頁開發語言,這時候,我們就需要在Apache中配置Pyth…

    編程 2025-04-28
  • Ubuntu系統激活Python環境

    本文將從以下幾個方面詳細介紹在Ubuntu系統中如何激活Python環境: 一、安裝Python 在Ubuntu系統中默認已經預裝了Python解釋器,可以通過以下命令來檢查: $…

    編程 2025-04-28
  • TFN MR56:高效可靠的網絡環境管理工具

    本文將從多個方面深入闡述TFN MR56的作用、特點、使用方法以及優點,為讀者全面介紹這一高效可靠的網絡環境管理工具。 一、簡介 TFN MR56是一款多功能的網絡環境管理工具,可…

    編程 2025-04-27
  • Vim Python3開發環境

    這篇文章將詳細介紹如何在Vim編輯器中搭建Python3開發環境。 一、安裝Vim插件 首先,需要安裝一些Vim插件來實現Python3的開發環境。我們可以通過Vim自帶的插件管理…

    編程 2025-04-27

發表回復

登錄後才能評論