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

gomobile.pdf

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Hiroshi Kurokawa Hiroshi Kurokawa
November 25, 2014
32

 gomobile.pdf

Avatar for Hiroshi Kurokawa

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 で書くのもあり。