Upgrade to Pro — share decks privately, control downloads, hide ads and more …

gomobile.pdf

Hiroshi Kurokawa
November 25, 2014
23

 gomobile.pdf

Hiroshi Kurokawa

November 25, 2014
Tweet

Transcript

  1. 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 なので、なにか作ってみたい
  2. Go でなにができるのか https://godoc.org/golang.org/x/mobile ネイティブアプリ Go を使って NDK で開発するアプリ。基本的に OpenGL で描

    画する。アクティビティは1つのみ。 → ゲーム開発向け 共有ライブラリ 共有ライブラリ(. s o ファイル)を生成して、Java から JNI 呼び出しをするアプリ。アプリ本体は、通常の SDK で開発で きる。
  3. ネイティブアプリの 開発手順(1/2) 以降では、NDK および go.mobile の開発環境が整っているとします。詳細 は を参照。 golang -

    go.mobileを動かしてみた。 - Qiita 普通に Go でプログラムを書ける a p p . R u n ( ) を呼ぶと、アプリが起動する 描画関数や、タッチイベントのコールバック関数は、この ときに引数として渡す 描画は Open GL ES 2 の API が用意されているのでそれを利 用する f u n c m a i n ( ) { a p p . R u n ( a p p . C a l l b a c k s { D r a w : d r a w , T o u c h : t o u c h , } ) }
  4. ネイティブアプリの 開発手順(2/2) ビルドについてはサンプル のg o l a n g .

    o r g / x / m o b i l e / e x a m p l e / b a s i c / m a k e . b a s h が 参考になる 以下のようにg o b u i l d でライブラリファイルをビルドし てn d k - b u i l d を走らせるだけ C G O _ E N A B L E D = 1 G O O S = a n d r o i d G O A R C H = a r m G O A R M = 7 g o b u i l d - l d f l a g s = " - s h a r e d " - o j n i / a r m e a b i / n d k - b u i l d N D K _ D E B U G = 1 a n t d e b u g
  5. 共有ライブラリの 開発手順(1/5) 必要なものがちょっと多い 1. Android アプリ本体 2. ライブラリ本体のコード 3. それを

    Java と binding するラッパーコード(Go と Java の ファイルが1つずつ) 4. ライブラリのエントリポイントとなる main.go
  6. 共有ライブラリの 開発手順(2/5) ここでは、以下のp r i m e . g o

    をライブラリにするとする p a c k a g e p r i m e f u n c M a x P r i m e ( n i n t 3 2 ) i n t 3 2 { . . . r e t u r n p } 次に binding コードを自動生成する必要がある 1. g o b i n d コマンドのインストール 2. 以下のコマンドを実行してコードを生成する $ g o i n s t a l l g o l a n g . o r g / x / m o b i l e / c m d / g o b i n d $ g o b i n d - l a n g = g o g i t h u b . c o m / h k u r o k a w a / g o d r o i d - s a m p l e > g o _ p r i m e / g o _ p r i m e . g o $ g o b i n d - l a n g = j a v a g i t h u b . c o m / h k u r o k a w a / g o d r o i d - s a m p l e > P r i m e . j a v a
  7. 共有ライブラリの 開発手順(3/5) 続いて、以下のようなコードをm a i n . g o として保存して、共

    有ライブラリを作成する p a c k a g e m a i n i m p o r t ( " g o l a n g . o r g / x / m o b i l e / a p p " _ " g i t h u b . c o m / h k u r o k a w a / g o d r o i d - s a m p l e / g o _ p r i m e " _ " g o l a n g . o r g / x / m o b i l e / b i n d / j a v a " ) f u n c m a i n ( ) { a p p . R u n ( a p p . C a l l b a c k s { } ) } $ C G O _ E N A B L E D = 1 G O O S = a n d r o i d G O A R C H = a r m G O A R M = 7 g o b u i l d - l d f l a g s = " - s h a r e d " . ブランク識別子(_ )を使って、生成した binding コードの import だけを行うのがミソ
  8. 共有ライブラリの 開発手順(4/5) 最後に生成されたファイルを Android プロジェクト以下に配 置すれば完了。注意点としては、 . s o ファイルの名前はl

    i b g o j n i . s o にすること g o l a n g . o r g / x / m o b i l e / b i n d / j a v a / S e q . j a v a および a p p / * . j a v a が必須(シンボリックリンク推奨) エミュレータの ABI は ARM にすること
  9. 共有ライブラリの 開発手順(5/5) 呼び出すときは以下のように行う。G o . i n i t (

    ) を忘れずに。 @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; m B u t t o n . s e t O n C l i c k L i s t e n e r ( n e w V i e w . O n C l i c k L i s t e n e r ( ) { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { f i n a l l o n g n = L o n g . p a r s e L o n g ( m I n p u t . g e t T e x t ( ) . t o S t r i n g ( ) ) ; f i n a l l o n g p = P r i m e . M a x P r i m e ( n ) ; m R e s u l t . s e t T e x t ( p ) ; } } ) ; G o . i n i t ( t h i s . g e t A p p l i c a t i o n C o n t e x t ( ) ) ;
  10. とりあえずのまとめ まだ制限が多くて、いますぐの開発は辛そう OpenGL の API は(意図的に)最小限なのでライブラリなどが必要? JNI 呼び出しの場合、引数および戻り値の型に制限がある(× array 型、×

    channel 型、× 複数戻り値...) Android Studio および gradle がサポートされていない Lollipop では動かない(“ c a n n o t o p e n / p r o c / s e l f / a u x v : P e r m i s s i o n d e n i e d ” ) JNI呼び出しのパフォーマンスは気になる C/C++ に比べてどれくらいメリットがあるかというと微妙 とはいえ Go が書けるのはうれしい クロスコンパイルが容易なのはうれしい。iOS もサポートされた ら、共通する処理は Go で書くのもあり。