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.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 , } ) }
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
をライブラリにするとする 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
有ライブラリを作成する 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 だけを行うのがミソ
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 にすること
) を忘れずに。 @ 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 ( ) ) ;
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 で書くのもあり。