安卓go語(yǔ)言開發(fā) go語(yǔ)言 安卓開發(fā)

如何Golang開發(fā)Android應(yīng)用

環(huán)境配置好復(fù)雜,我不得不嘮叨幾句。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了平定免費(fèi)建站歡迎大家使用!

需要下載golang1.4rc版,下載ndk,然后編譯。 然后用go get 下載gobind這個(gè)工具, 然后,將寫好的代碼用gobind轉(zhuǎn)化下,然后使用特殊的編譯命令,將代碼編譯成.so文件,將生成的相關(guān)文件,放到android studio的項(xiàng)目中。然后java代碼中,利用jni調(diào)用引用的代碼。

... 好,接著往下看吧。

環(huán)境準(zhǔn)備

一臺(tái)Linux 64的機(jī)器

一個(gè)帶有AndroidStudioIDE的開發(fā)機(jī)器

因?yàn)榄h(huán)境配置實(shí)在復(fù)雜,所以我們引入的docker。

docker pull codeskyblue/docker-goandroid

docker run --rm -ti codeskyblue/docker-goandroid bash

cd example; echo "view example projects

docker起來(lái)之后,什么就都配置好了,NDK啦,java啦,GO的環(huán)境變量了,等等,并且還預(yù)裝了vim,gradle,tmux,git,syncthing,svn

開始寫代碼

寫代碼之前,先約定下目錄結(jié)構(gòu)

go的代碼都放在src/golib下,編譯使用make.bash編譯腳本,看下這個(gè)文件樹

.

|-- app.iml

|-- build.gradle

|-- libs/armeabi-v7a # go編譯生成的so文件

| `-- libgojni.so

|-- main.go_tmpl # 一個(gè)模板文件,先不用管它

|-- make.bash # 編譯腳本,用來(lái)生成.so和Java代碼

`-- src

|-- golib

| |-- hi

| | |-- go_hi?0?2?0?2?0?2 # 自動(dòng)生成的代碼

| | | `-- go_hi.go

| | `-- hi.go # 需要編寫的代碼

| `-- main.go

`-- main

|-- AndroidManifest.xml

|-- java

| |-- go # 自動(dòng)生成的代碼

| | |-- Go.java

| | |-- Seq.java

| | `-- hi

| | `-- Hi.java

| `-- me/shengxiang/gohello # 主要的邏輯代碼

| `-- MainActivity.java

`-- res

我已經(jīng)寫了一個(gè)例子,先直接搞下來(lái)

編譯下,試試行不行(就算不行問題應(yīng)該也不大,因?yàn)榇髥栴}都被我消滅了)

cd GoHello/app

./make.bash

../gradlew build

一切順利的話在build/outputs/apk下應(yīng)該可以看到app-debug.apk這個(gè)文件。(劇透下,這個(gè)文件只有800多K)

編譯好的我放到qiniu上了,可以點(diǎn)擊下載看看

下面可以嘗試改改,我拋磚引玉說(shuō)下

打開hi.go這個(gè)文件

hi.go的內(nèi)容,比較簡(jiǎn)單,我們寫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();

}

});

編譯運(yùn)行下,把生成的apk安裝到手機(jī)上試試。

原理解讀(有興趣的接著看)

首先說(shuō)下gobind這個(gè)工具。

go_hi/go_hi.go這個(gè)文件時(shí)通過(guò)gobind這個(gè)工具生成的,用來(lái)配合一個(gè)簡(jiǎn)單的程序,生成.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)

}

這個(gè)簡(jiǎn)單的程序內(nèi)容是這樣的

// 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文件內(nèi)容是這樣的

import ...

import go.Go; // 引入Go這個(gè)包

import go.hi.Hi; // gobind生成的代碼

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Go.init(getApplicationContext()); // 初始化兩個(gè)線程

Hi.Hello("world");

}

}

其中有一句Go.init(...)這里再看go.Go這個(gè)包是什么樣子的

public final class Go {

// init loads libgojni.so and starts the runtime.

public static void init(Context context) {

... 判斷該函數(shù)是否該執(zhí)行的代碼 -- 省略 --

System.loadLibrary("gojni"); // gojni需要這句

new Thread("GoMain") {

public void run() {

Go.run(); // run()是一個(gè)native方法

}

}.start();

Go.waitForRun(); // 這個(gè)也是一個(gè)native方法

// 這部分可以理解為,啟動(dòng)了一個(gè)后臺(tái)線程不斷的接收結(jié)果到緩存中。

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,這個(gè)文件也是gobind生成的,是用來(lái)給java方便的調(diào)用.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); // 下面接著說(shuō)

}

private static final int CALL_Hello = 1;

private static final String DESCRIPTOR = "hi";

}

Seq.send這部分實(shí)際上最終調(diào)用的是一段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語(yǔ)言開發(fā)Android應(yīng)用

Go 語(yǔ)言是一個(gè)試圖結(jié)合動(dòng)態(tài)類型和靜態(tài)類型,編譯效率和安全性以及語(yǔ)言的易用性等眾多特性與一體的一種嘗試。他的另一個(gè)目標(biāo)是支持現(xiàn)代的基于網(wǎng)絡(luò)的、基于多核的計(jì)算。最后,Go 還是非??斓?,他可以在單個(gè)計(jì)算機(jī)上僅僅花費(fèi)幾秒時(shí)間構(gòu)建一個(gè)龐大的應(yīng)用程序。使用GO語(yǔ)言開發(fā)android語(yǔ)言步驟如下:

1. 下載安裝Go語(yǔ)言(版本1.5+)

Golang鏈接

回到頂部

2. 下載安裝 gomobile

下載

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

安裝(需要等待幾分鐘)

gomobile init

回到頂部

3. Golang開發(fā)手機(jī)應(yīng)用有兩種方式

a. 原生應(yīng)用開發(fā)

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

主要應(yīng)用領(lǐng)域:

應(yīng)用控制管理與配置

OpenGL ES 2 綁定

Asset 管理

Event 管理

試驗(yàn)中的包,含有OpenAL 綁定、音頻、字體、圖形以及運(yùn)動(dòng)傳感器

Android開發(fā)

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

此命令會(huì)生成名為basic的apk安裝包

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

此命令將安裝apk包到已連接的android設(shè)備

為什么蘋果可以用兩種編程語(yǔ)言開發(fā)應(yīng)用?而安卓只能用JAVA。不能用其他呢?Go語(yǔ)言不支持安卓?

蘋果公司允許開發(fā)人員使用 Objective-C 和 Swift 兩種編程語(yǔ)言開發(fā) iOS 應(yīng)用,因?yàn)檫@兩種語(yǔ)言已經(jīng)緊密地與蘋果的開發(fā)環(huán)境和工具集整合在一起。

安卓操作系統(tǒng)原生支持 Java 語(yǔ)言,因此它是安卓應(yīng)用開發(fā)的首選語(yǔ)言。但是,安卓也支持使用其他語(yǔ)言(如 Kotlin)來(lái)開發(fā)應(yīng)用,并且使用其他語(yǔ)言的開發(fā)人員可以通過(guò) Java Native Interface (JNI) 訪問安卓的底層系統(tǒng) API。

Go語(yǔ)言不是安卓操作系統(tǒng)原生支持的語(yǔ)言,因此需要使用其他方法才能在安卓上開發(fā) Go 語(yǔ)言應(yīng)用。

具體的方法有:

gomobile: Go 語(yǔ)言官方支持的工具,用于在安卓和 iOS 上編譯 Go 代碼為本地應(yīng)用。

go-android: 一個(gè)開源庫(kù),用于在安卓上運(yùn)行 Go 語(yǔ)言代碼。

go-gtk: 一個(gè)庫(kù),用于在安卓上使用 GTK+ 構(gòu)建 GUI 應(yīng)用。

這些項(xiàng)目允許開發(fā)人員在安卓上使用 Go 語(yǔ)言開發(fā)應(yīng)用,但請(qǐng)注意,目前這些項(xiàng)目可能仍然處于試驗(yàn)階段,不保證穩(wěn)定性和性能。

Go語(yǔ)言怎么樣?

根據(jù)Go趨勢(shì)報(bào)告顯示,全球范圍內(nèi)有 110 萬(wàn)專業(yè)開發(fā)者選擇Go作為其主要開發(fā)語(yǔ)言。如果把以其他編程語(yǔ)言作為主要開發(fā)語(yǔ)言,同時(shí)也在使用Go的開發(fā)者計(jì)算在內(nèi),這一數(shù)字將高達(dá)270萬(wàn),中國(guó)的Go語(yǔ)言開發(fā)者排名第一,全球占比超過(guò)16%。

Go 語(yǔ)言能夠支持并構(gòu)建與微服務(wù)結(jié)合的內(nèi)部工具、架構(gòu)和后端服務(wù)而深受IT企業(yè)歡迎,許多IT架構(gòu)工具由Go構(gòu)建而成,例如大型的Kubernetes、Docker和Vault等。數(shù)據(jù)顯示,有63%的具有統(tǒng)治力的云原生項(xiàng)目都是用Go構(gòu)建。

因此,博睿數(shù)據(jù)在國(guó)內(nèi)首發(fā)支持Go語(yǔ)言智能探針,對(duì)于提升業(yè)務(wù)性能,助力企業(yè)數(shù)字化轉(zhuǎn)型有著非常重要的意義。

SmartAgent探針技術(shù)集結(jié)主流編程語(yǔ)言

SmartAgent是博睿數(shù)據(jù)自研的自動(dòng)化部署的一體化探針,在已支持JAVA,PHP,.net,Nodejs,.NET Core,Python的基礎(chǔ)上,新增了對(duì)Go語(yǔ)言的支持。

相較而言,傳統(tǒng)探針技術(shù)需要客戶配合修改應(yīng)用程序代碼,風(fēng)險(xiǎn)不可控,需要客戶重新編譯程序集成探針,耦合度高。

不同于行業(yè)內(nèi)傳統(tǒng)探針技術(shù),博睿數(shù)據(jù)GoAgent探針直接后臺(tái)安裝即可,主動(dòng)注入和嵌碼,降低與客戶程序耦合、無(wú)需二次修改代碼、提高 GoAgent 技術(shù)易用性。無(wú)論是動(dòng)態(tài)編譯還是靜態(tài)編譯的代碼,博睿數(shù)據(jù)Samrt Agent技術(shù)都可以在不進(jìn)行任何修改的情況下進(jìn)行服務(wù)級(jí)別和代碼級(jí)別的分布式鏈路跟蹤,實(shí)現(xiàn)業(yè)務(wù)的可觀測(cè)性。

GoAgent探針支持六大功能,實(shí)現(xiàn)全鏈路追蹤

當(dāng)前文章:安卓go語(yǔ)言開發(fā) go語(yǔ)言 安卓開發(fā)
URL標(biāo)題:http://muchs.cn/article22/doeigjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)靜態(tài)網(wǎng)站、虛擬主機(jī)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)