SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
go.mobile で Android 開発 
黒川 洋 / @hydrakecat
Go 1.4 で Android がサポート 
されるらしい 
“Go 1.4 can build binaries for ARM processors 
running the Android operating system. It can also 
build a .so library that can be loaded by an 
Android application using the supporting 
packages in the mobile subrepository.” 
せっかく、Gopher 兼 Androider なので、なにか作ってみたい
Go でなにができるのか 
https://godoc.org/golang.org/x/mobile 
ネイティブアプリ 
Go を使って NDK で開発するアプリ。基本的に OpenGL で描 
画する。アクティビティは1つのみ。 
→ ゲーム開発向け 
共有ライブラリ 
共有ライブラリ(.soファイル)を生成して、Java から JNI 
呼び出しをするアプリ。アプリ本体は、通常の SDK で開発で 
きる。
ネイティブアプリの 
開発手順(1/2) 
以降では、NDK および go.mobile の開発環境が整っているとします。詳細 
はgolang - go.mobileを動かしてみた。 - Qiitaを参照。 
普通に Go でプログラムを書ける 
app.Run() を呼ぶと、アプリが起動する 
描画関数や、タッチイベントのコールバック関数は、この 
ときに引数として渡す 
描画は Open GL ES 2 の API が用意されているのでそれを利 
用する 
func main() { 
app.Run(app.Callbacks{ 
Draw: draw, 
Touch: touch, 
}) 
}
ネイティブアプリの 
開発手順(2/2) 
ビルドについてはサンプル 
のgolang.org/x/mobile/example/basic/make.bashが 
参考になる 
以下のようにgo buildでライブラリファイルをビルドし 
てndk-buildを走らせるだけ 
CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" -o jni/armeabi/ndk-build NDK_DEBUG=1 
ant debug
共有ライブラリの 
開発手順(1/5) 
必要なものがちょっと多い 
1. Android アプリ本体 
2. ライブラリ本体のコード 
3. それを Java と binding するラッパーコード(Go と Java の 
ファイルが1つずつ) 
4. ライブラリのエントリポイントとなる main.go
共有ライブラリの 
開発手順(2/5) 
ここでは、以下のprime.goをライブラリにするとする 
package prime 
func MaxPrime(n int32) int32 { 
... 
return p 
} 
次に binding コードを自動生成する必要がある 
1. gobindコマンドのインストール 
$ go install golang.org/x/mobile/cmd/gobind 
2. 以下のコマンドを実行してコードを生成する 
$ gobind -lang=go github.com/hkurokawa/godroid-sample > go_prime/go_prime.go 
$ gobind -lang=java github.com/hkurokawa/godroid-sample > Prime.java
共有ライブラリの 
開発手順(3/5) 
続いて、以下のようなコードをmain.goとして保存して、共 
有ライブラリを作成する 
package main 
import ( 
"golang.org/x/mobile/app" 
_ "github.com/hkurokawa/godroid-sample/go_prime" 
_ "golang.org/x/mobile/bind/java" 
) 
func main() { 
app.Run(app.Callbacks{}) 
} 
$ CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" . 
ブランク識別子(_)を使って、生成した binding コードの 
import だけを行うのがミソ
共有ライブラリの 
開発手順(4/5) 
最後に生成されたファイルを Android プロジェクト以下に配 
置すれば完了。注意点としては、 
.soファイルの名前はlibgojni.soにすること 
golang.org/x/mobile/bind/java/Seq.java および 
app/*.javaが必須(シンボリックリンク推奨) 
エミュレータの ABI は ARM にすること
共有ライブラリの 
開発手順(5/5) 
呼び出すときは以下のように行う。Go.init()を忘れずに。 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
mButton.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
final long n = Long.parseLong(mInput.getText().toString()); 
final long p = Prime.MaxPrime(n); 
mResult.setText(p); 
} 
}); 
Go.init(this.getApplicationContext());
動かしたところ 
実装も違うのでなんとも言えないけれど、意外と遅い...(要 
調査) ←すみません、これはプログラムの書き方の問題で普 
通に書けば Go の方が速いです(2014-11-25 追記)
とりあえずのまとめ 
まだ制限が多くて、いますぐの開発は辛そう 
OpenGL の API は(意図的に)最小限なのでライブラリなどが必要? 
JNI 呼び出しの場合、引数および戻り値の型に制限がある(× array 
型、× channel 型、× 複数戻り値...) 
Android Studio および gradle がサポートされていない 
Lollipop では動かない(“cannot open /proc/self/auxv: 
Permission denied”) 
JNI呼び出しのパフォーマンスは気になる 
C/C++ に比べてどれくらいメリットがあるかというと微妙 
とはいえ 
Go が書けるのはうれしい 
クロスコンパイルが容易なのはうれしい。iOS もサポートされた 
ら、共通する処理は Go で書くのもあり。

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
 
Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践
 
Cloud functionsの紹介
Cloud functionsの紹介Cloud functionsの紹介
Cloud functionsの紹介
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
Gopher Fest 2017参加レポート
Gopher Fest 2017参加レポートGopher Fest 2017参加レポート
Gopher Fest 2017参加レポート
 
実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで
 
gopher-lua
gopher-luagopher-lua
gopher-lua
 
エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法
 
Golang入門
Golang入門Golang入門
Golang入門
 
Go言語でBot開発やってみた
Go言語でBot開発やってみたGo言語でBot開発やってみた
Go言語でBot開発やってみた
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Cloud Functionsの紹介
Cloud Functionsの紹介Cloud Functionsの紹介
Cloud Functionsの紹介
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
GAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使うGAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使う
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
 
Go初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうGo初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろう
 
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違いPHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
PHP開発からAndroid開発をするようになって学んだWebとモバイルの違い
 
Vue.js with Go
Vue.js with GoVue.js with Go
Vue.js with Go
 
僕がAndroid開発する時にちょっと便利だと思うtips
僕がAndroid開発する時にちょっと便利だと思うtips僕がAndroid開発する時にちょっと便利だと思うtips
僕がAndroid開発する時にちょっと便利だと思うtips
 

Andere mochten auch

Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
Masakazu Muraoka
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
Hidenori Takeshita
 

Andere mochten auch (20)

Go入門
Go入門Go入門
Go入門
 
【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ IIマスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
 
Goでwebアプリを開発してみよう
Goでwebアプリを開発してみようGoでwebアプリを開発してみよう
Goでwebアプリを開発してみよう
 
Go for Mobile Games
Go for Mobile GamesGo for Mobile Games
Go for Mobile Games
 
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
 
Go+revel
Go+revelGo+revel
Go+revel
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #gocon
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
 
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets heroku
 
Github第8章
Github第8章Github第8章
Github第8章
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
 
Goを知る
Goを知るGoを知る
Goを知る
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間
 
HighBatch
HighBatchHighBatch
HighBatch
 
ISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみたISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみた
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
 

Ähnlich wie go.mobile で Android 開発

NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
Naruto TAKAHASHI
 
20130720 firefox os勉強会
20130720 firefox os勉強会20130720 firefox os勉強会
20130720 firefox os勉強会
Masaya Nakayama
 

Ähnlich wie go.mobile で Android 開発 (20)

PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化
 
さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪
 
A Framework for LightUp Applications of Grani
A Framework for LightUp Applications of GraniA Framework for LightUp Applications of Grani
A Framework for LightUp Applications of Grani
 
Android App Development with Gradle & Android Studio
Android App Development with Gradle & Android StudioAndroid App Development with Gradle & Android Studio
Android App Development with Gradle & Android Studio
 
Golang handson
Golang handsonGolang handson
Golang handson
 
gomobile
gomobilegomobile
gomobile
 
Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
 
Cordovaコトハジメ( Html5fun×senchUG )
Cordovaコトハジメ( Html5fun×senchUG )Cordovaコトハジメ( Html5fun×senchUG )
Cordovaコトハジメ( Html5fun×senchUG )
 
Hudson using Groovy #jggug
Hudson using Groovy  #jggugHudson using Groovy  #jggug
Hudson using Groovy #jggug
 
Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
20130720 firefox os勉強会
20130720 firefox os勉強会20130720 firefox os勉強会
20130720 firefox os勉強会
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
PhoneGapの始め方
PhoneGapの始め方PhoneGapの始め方
PhoneGapの始め方
 
Go goes Mobile: Quick Exploration on Go 1.5 and Gomobile
Go goes Mobile: Quick Exploration on Go 1.5 and GomobileGo goes Mobile: Quick Exploration on Go 1.5 and Gomobile
Go goes Mobile: Quick Exploration on Go 1.5 and Gomobile
 
Driverについて
DriverについてDriverについて
Driverについて
 
20150802 codeal androidアプリを作ろう(おみくじアプリ編)
20150802 codeal androidアプリを作ろう(おみくじアプリ編)20150802 codeal androidアプリを作ろう(おみくじアプリ編)
20150802 codeal androidアプリを作ろう(おみくじアプリ編)
 
Unity + AndroidでモバイルVRハンズオン
Unity + AndroidでモバイルVRハンズオンUnity + AndroidでモバイルVRハンズオン
Unity + AndroidでモバイルVRハンズオン
 
冬だからAndroid再入門
冬だからAndroid再入門冬だからAndroid再入門
冬だからAndroid再入門
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

go.mobile で Android 開発

  • 1. go.mobile で Android 開発 黒川 洋 / @hydrakecat
  • 2. Go 1.4 で Android がサポート されるらしい “Go 1.4 can build binaries for ARM processors running the Android operating system. It can also build a .so library that can be loaded by an Android application using the supporting packages in the mobile subrepository.” せっかく、Gopher 兼 Androider なので、なにか作ってみたい
  • 3. Go でなにができるのか https://godoc.org/golang.org/x/mobile ネイティブアプリ Go を使って NDK で開発するアプリ。基本的に OpenGL で描 画する。アクティビティは1つのみ。 → ゲーム開発向け 共有ライブラリ 共有ライブラリ(.soファイル)を生成して、Java から JNI 呼び出しをするアプリ。アプリ本体は、通常の SDK で開発で きる。
  • 4. ネイティブアプリの 開発手順(1/2) 以降では、NDK および go.mobile の開発環境が整っているとします。詳細 はgolang - go.mobileを動かしてみた。 - Qiitaを参照。 普通に Go でプログラムを書ける app.Run() を呼ぶと、アプリが起動する 描画関数や、タッチイベントのコールバック関数は、この ときに引数として渡す 描画は Open GL ES 2 の API が用意されているのでそれを利 用する func main() { app.Run(app.Callbacks{ Draw: draw, Touch: touch, }) }
  • 5. ネイティブアプリの 開発手順(2/2) ビルドについてはサンプル のgolang.org/x/mobile/example/basic/make.bashが 参考になる 以下のようにgo buildでライブラリファイルをビルドし てndk-buildを走らせるだけ CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" -o jni/armeabi/ndk-build NDK_DEBUG=1 ant debug
  • 6. 共有ライブラリの 開発手順(1/5) 必要なものがちょっと多い 1. Android アプリ本体 2. ライブラリ本体のコード 3. それを Java と binding するラッパーコード(Go と Java の ファイルが1つずつ) 4. ライブラリのエントリポイントとなる main.go
  • 7. 共有ライブラリの 開発手順(2/5) ここでは、以下のprime.goをライブラリにするとする package prime func MaxPrime(n int32) int32 { ... return p } 次に binding コードを自動生成する必要がある 1. gobindコマンドのインストール $ go install golang.org/x/mobile/cmd/gobind 2. 以下のコマンドを実行してコードを生成する $ gobind -lang=go github.com/hkurokawa/godroid-sample > go_prime/go_prime.go $ gobind -lang=java github.com/hkurokawa/godroid-sample > Prime.java
  • 8. 共有ライブラリの 開発手順(3/5) 続いて、以下のようなコードをmain.goとして保存して、共 有ライブラリを作成する package main import ( "golang.org/x/mobile/app" _ "github.com/hkurokawa/godroid-sample/go_prime" _ "golang.org/x/mobile/bind/java" ) func main() { app.Run(app.Callbacks{}) } $ CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" . ブランク識別子(_)を使って、生成した binding コードの import だけを行うのがミソ
  • 9. 共有ライブラリの 開発手順(4/5) 最後に生成されたファイルを Android プロジェクト以下に配 置すれば完了。注意点としては、 .soファイルの名前はlibgojni.soにすること golang.org/x/mobile/bind/java/Seq.java および app/*.javaが必須(シンボリックリンク推奨) エミュレータの ABI は ARM にすること
  • 10. 共有ライブラリの 開発手順(5/5) 呼び出すときは以下のように行う。Go.init()を忘れずに。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final long n = Long.parseLong(mInput.getText().toString()); final long p = Prime.MaxPrime(n); mResult.setText(p); } }); Go.init(this.getApplicationContext());
  • 11. 動かしたところ 実装も違うのでなんとも言えないけれど、意外と遅い...(要 調査) ←すみません、これはプログラムの書き方の問題で普 通に書けば Go の方が速いです(2014-11-25 追記)
  • 12. とりあえずのまとめ まだ制限が多くて、いますぐの開発は辛そう OpenGL の API は(意図的に)最小限なのでライブラリなどが必要? JNI 呼び出しの場合、引数および戻り値の型に制限がある(× array 型、× channel 型、× 複数戻り値...) Android Studio および gradle がサポートされていない Lollipop では動かない(“cannot open /proc/self/auxv: Permission denied”) JNI呼び出しのパフォーマンスは気になる C/C++ に比べてどれくらいメリットがあるかというと微妙 とはいえ Go が書けるのはうれしい クロスコンパイルが容易なのはうれしい。iOS もサポートされた ら、共通する処理は Go で書くのもあり。