如何Golang開發(fā)Android應(yīng)用:
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),錦屏企業(yè)網(wǎng)站建設(shè),錦屏品牌網(wǎng)站建設(shè),網(wǎng)站定制,錦屏網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,錦屏網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
一丶準(zhǔn)備
1.一臺(tái)Linux 64的機(jī)器
2.一個(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起來之后,什么就都配置好了,NDK,java,GO的環(huán)境變量了,等等,并且還預(yù)裝了vim,gradle,tmux,git,syncthing,svn
二丶代碼
1.寫代碼之前,先約定下目錄結(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 # 編譯腳本,用來生成.so和Java代碼
`-- src
|-- golib
| ? |-- hi
| ? | ? |-- go_hi#1438;#1438;#1438; # 自動(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#1438;#1438;#1438;
? ?`-- res
2.寫了一個(gè)例子
git clone
3.編譯下,試試行不行(就算不行問題應(yīng)該也不大,因?yàn)榇髥栴}都被消滅了)
cd GoHello/app
./make.bash
../gradlew build
4.一切順利的話在build/outputs/apk下應(yīng)該可以看到app-debug.apk這個(gè)文件。
編譯好的放到qiniu上了,可以點(diǎn)擊下載看看
下面可以嘗試改改
打開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"
}
5.文件末尾添加下面這行代碼
func Welcome(name string) string {
return fmt.Sprintf("Welcome %s to the go world", name)
}
使用./make.bash重新編譯下
6.打開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ī)上試試。
brew install go
輸入 brew info go 或者 go env 即可查看當(dāng)前安裝的golang版本信息
注意:千萬不要把GOPATH設(shè)置成go的安裝路徑,可以自己在用戶目錄下創(chuàng)建一個(gè)目錄,例如mygo
一般安裝好go之后,使用go env查看一下當(dāng)前環(huán)境。此時(shí)顯示出來的GOROOT就是你使用brew安裝go的安裝目錄,這個(gè)路徑要記下來。接下來要在bash_profile文件中進(jìn)行配置。
使用vim ~/.bash_profile
然后在這個(gè)文件中進(jìn)行編輯,下面以我的電腦為例,路徑這種要根據(jù)不同人的情況而定
GOROOT=/usr/local/Cellar/go/1.10.1/libexec (改成自己的go安裝目錄 go env命令可查看)
export GOROOT (不用動(dòng))
export GOPATH=/Users/jiangqiaowei/mygo (創(chuàng)建一個(gè)自己的文件夾 管理go相關(guān)內(nèi)容)
export GOBIN=$GOPATH/bin (不用改)
export PATH=$PATH:$GOBIN:$GOROOT/bin (不用改)
$ go get golang.org/x/mobile/cmd/gomobile (需要墻)
gomobile init
$ go get -d golang.org/x/mobile/example/bind/...
$ cd $GOPATH/src/golang.org/x/mobile/example/bind
$ gomobile bind -target=ios golang.org/x/mobile/example/bind/hello
此命令在ios/路徑下生成bind.xcodeprojxcode項(xiàng)目以及 在bind/目錄下生成一個(gè) hello.framework
拖入項(xiàng)目即可使用
測(cè)試動(dòng)態(tài)庫步驟:
1、test_so.h
2、test_so.c
3、生成so
4、復(fù)制so文件到Go項(xiàng)目目錄
Go項(xiàng)目目錄
1、load_so.h
2、load_so.c
3、test.go
4、Go項(xiàng)目目錄要放在$GOPATH/src/目錄下,這也是正常操作。
test目錄為Go項(xiàng)目,里邊是上述創(chuàng)建的所有源碼文件。
在$GOPATH/src/test/里直接使用gobuild編譯生成test二進(jìn)制文件,此處需要注意執(zhí)行路徑。
問題
1、/**/注釋的代碼下一行一定是import“C”,中間不能有空行
2、importC必須單獨(dú)一行,不能和其它庫一起導(dǎo)入
3、有人編譯的時(shí)候會(huì)報(bào)錯(cuò):
這個(gè)主要是執(zhí)行目錄問題,一定要在$GOPATH/src/項(xiàng)目/目錄下,用gobuild執(zhí)行,gobuild后邊不要有任何文件名。
或者用gorun.運(yùn)行,或者goruntest,test是項(xiàng)目名。不能用goruntest.go。
4、還有人報(bào)這個(gè)錯(cuò):test.go文件里的cgoLDFLAGS:-ldl這一行不要?jiǎng)h掉。
直接調(diào)用so的函數(shù)cgo應(yīng)該繞不開吧,我寫過一個(gè)銀行的應(yīng)用程序調(diào)用其特色業(yè)務(wù)接口,因?yàn)榻涌谥恢С謈和java,我就封裝了一個(gè)c的so,然后用cgo調(diào)用后寫了一個(gè)RPC供遠(yuǎn)程的go語言調(diào)用,因?yàn)镽PC只負(fù)責(zé)信息交互不負(fù)責(zé)業(yè)務(wù)邏輯,所以寫了不到百行,以后基本不用再改。記住雖然go語言自帶gc,但cgo還是要手工釋放內(nèi)存哦。