SlideShare a Scribd company logo
Mobile Apps
by Pure Go
with Reverse Binding
GopherCon India
22nd Feb. 2017
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0
Attributions license.
Slide URL: https://goo.gl/OG55gT
Slide URL: https://goo.gl/OG55gT
Who am I?
Mercari, Inc./Souzoh, Inc.
Takuya Ueda
twitter: @tenntenn
■ Communities
Google Cloud Platform User Group (GCPUG) Tokyo
Go Beginners in Tokyo, Japan
golang.tokyo
Go Conference in Tokyo, Japan
■ Works
Developing Mercari Atte in GAE/Go
2
Slide URL: https://goo.gl/OG55gT
What is this talk about?
● The Basics of Go Mobile
○ Cross-compile / cgo for Android
○ What is Go Mobile?
○ SDK Apps and Native Apps
● Developing Android Apps in pure Go
○ gomobile bind
○ What is Reverse Bindings?
○ Use Platform APIs from Go
3
Slide URL: https://goo.gl/OG55gT
The Basics of Go Mobile
4
Slide URL: https://goo.gl/OG55gT
Cross-compile
● GOOS and GOARCH
○ Go can cross-compile
○ GOOS indicates target OS
○ GOARCH indicates target architecture
5
# Build for 32bit Windows
$ GOOS=windows GOARCH=386 go build
# Build for arm Linux
$ GOOS=linux GOARCH=arm go build
A linux/arm binary also works on android devices.
Slide URL: https://goo.gl/OG55gT
Web server on Android Device
6
Watch at Youtube Source Code
Android
Shell on Mac
adb shell
Slide URL: https://goo.gl/OG55gT
cgo
● C codes into Go codes
7
import "unsafe"
/*
#include <stdio.h>
#include <stdlib.h>
void hello(char *s) { printf("Hello, %sn", s); }
*/
import "C"
func main() {
str := C.CString("GopherCon India")
C.hello(str)
C.free(unsafe.Pointer(str))
}
Comments before import "C"
would be built as C codes
Call C’s function from Go code
Slide URL: https://goo.gl/OG55gT
cgo for Android
● cgo codes also can be cross-compiled
8
$ CGO_ENABLED=1
CC=arm-linux-androideabi-gcc
GOOS=android
GOARCH=arm
GOARM=7
go build -buildmode=pie hellocgo.go
$ adb push hellocgo /data/local/tmp
$ chmod 755 /data/local/tmp/hellocgo
$ /data/local/tmp/hellocgo
Hello, GopherCon India
GOOS should be android
when CGO_ENABLED is 1.
Enable cgo at cross-compiling
adb shell
PC
Slide URL: https://goo.gl/OG55gT
buildmode
● Change output formats
○ archive, c-archive
■ build into C archive (.a file)
○ shared, c-shared
■ build into shared library (.so file)
○ plugin
■ bulid into Go Plugin (<= Go 1.8)
○ exe
■ build into executable file
○ pie
■ build into PIE style executable file
9
archive and
shared ignore
main package
Go can build to .so files for Android
Slide URL: https://goo.gl/OG55gT
Go Mobile
● What is Go Mobile?
○ Go Mobile is a toolkit for Mobile Platform
(Android and iOS) in Go.
● How Go Mobile works?
○ Go Mobile provides bindings of Android
and iOS through cgo.
10
Go C
Java
Obj-C
JNIcgo
Android
iOS
Slide URL: https://goo.gl/OG55gT
Go Mobile
11
https://github.com/golang/mobile
Slide URL: https://goo.gl/OG55gT
Installation
● Install gomobile comand
● Initialize the build tool chain
○ gomobile init initializes the build tool
chain for mobile apps.
12
$ gomobile init -v
$ ls $GOPATH/pkg/gomobile
android_ndk_root pkg_android_amd64
pkg_android_arm64 pkg_darwin_arm version
pkg_android_386 pkg_android_arm
pkg_darwin_amd64 pkg_darwin_arm64
$ go get -u golang.org/x/mobile/cmd/gomobile
Slide URL: https://goo.gl/OG55gT
gomobile command
gomobile command provides sub-commands.
● Sub-commands
13
bind build a library for Android and iOS
build compile Android APK and iOS app
clean remove object files and cached gomobile files
init install android compiler toolchain
install compile android APK and install on device
version print version
Slide URL: https://goo.gl/OG55gT
SDK Apps and Native Apps
Go Mobile provides two ways to develop mobile
apps.
■ SDK Apps
● Write common funcations in Go as a
library
■ Native Apps
● Write UI and all codes in Go
14
Slide URL: https://goo.gl/OG55gT
SDK Apps and Native Apps
● SDK Apps for Android
● Native Apps for Android
15
Go
aar file
Binding Classes (Java)
Shared library (.so)
Java
UI, IAB, ...
As a library
gomobile bind
apk file
Go
GoNativeActivity
Shared library (.so)UI, audio, ...
gomobile build
Slide URL: https://goo.gl/OG55gT
An Example of SDK Apps: Ivy
● Ivy big number calculator (source code)
○ Interpriter for APL-like language
○ Android App and iOS App use a same engine
○ The engine is written in Go by Rob Pike
16
Google Play App Store
Slide URL: https://goo.gl/OG55gT
An Example of Native Apps
● Flappy Gopher
○ A mobile game written in Go Mobile
○ Developed by Andrew Gerrand
for Go Conference 2015 Winter
○ Source Code
17
Slide URL: https://goo.gl/OG55gT
Developing Android Apps
in Pure Go
18
Slide URL: https://goo.gl/OG55gT
gomobile bind
● Generate an Android Archive (.aar)
○ a shared library (.so) written in Go
○ a JAR file which is bult Java bindings
● Develop with Android Studio Plugin
○ Runs gomobile bind
○ Links to a generated .aar file
19
$ gomobile bind [-target ios|android] mypkg
Slide URL: https://goo.gl/OG55gT
Contents of an AAR file
20
$ gomobile bind sample
$ unzip -Z1 sample.aar
AndroidManifest.xml
proguard.txt
classes.jar
jni/armeabi-v7a/libgojni.so
jni/arm64-v8a/libgojni.so
jni/x86/libgojni.so
jni/x86_64/libgojni.so
R.txt
res/
Compiled Java codes
Compiled
Go/C codes
Slide URL: https://goo.gl/OG55gT
Calling Go code from Java code
21
Bindings
Java codes
Application Codes
(Java)
C codes
Go/cgo codes
JNI Generated by
gomobile bind
SDK Codes
(Go)
cgo
Slide URL: https://goo.gl/OG55gT
An Example of Bindings
22
package sample
func Hello() string { return "Hello" }
type MyStruct struct { Str string }
func (s MyStruct) MyMethod() string { return s.Str }
public abstract class Sample {
// ...
private Sample() {} // uninstantiable
public static final class MyStruct extends Seq.Proxy {
public final native String getStr();
public final native void setStr(String v);
public native String MyMethod();
// ...
}
public static native String Hello();
}
Java
Go
Struct
Field
Method
Package Function
Slide URL: https://goo.gl/OG55gT
Type restrictions
● Signed integer and floating point type
● String and boolean type
● Byte slice type
● Any functions
○ parameter and result types must be supported types
○ results are 0, 1 or 2 (2nd result must be an error
type)
● Any struct type
○ all fields and methods must be supported types
● Any interface
○ all methods must be supported types
23
Slide URL: https://goo.gl/OG55gT
Calling Platform API from Go
● In-app Billing
○ Purchase a items in the game
● SNS connection
○ Facebook, Twitter, ...
● Advertisements
● Analytics
○ Google Analytics, Firebase, Facebook
Analytics,...
24
These APIs are provided
as Java SDK for Android
Slide URL: https://goo.gl/OG55gT
Traditional gomobile bind
● Bindings to Go from Java/Obj-C
● Platform APIs can be accessed BUT...
○ Indirect way
○ Needs wrappers
○ Not convenient
25
A way to access directly
Platform APIs from Go is needed!
Slide URL: https://goo.gl/OG55gT
Reverse Bindings
● Access Platform APIs from Go
● Generate bindings automatically
○ Reverse direction of traditional one
○ use gomobile bind
● Prposed by #16876 and #17102
(Android) (iOS)
26
Slide URL: https://goo.gl/OG55gT
Reverse Bindings
27
Bindings
Java codes
Go Codes
C codes
Go/cgo codes
JNI
Generated by
gomobile bind
Platform APIs
(Java)
cgo
Slide URL: https://goo.gl/OG55gT
An Example of Reverse Bindings
28
package pkg
import "Java/java/lang"
import "Java/pkg"
type Obj struct {
lang.Object
}
func (h *Obj) ToString(this *pkg.Obj) string {
return "hoge"
}
● Parse import statements
○ Java/* or ObjC/*
● Generate bindings automatically
corresponds java.lang
package in Java
inherit java.lang.Object
Hold a Java instance
Slide URL: https://goo.gl/OG55gT
How Generate Reverse Bindings?
● Parse import statements
○ Begin with Java/
● Extract class infomation by javap
○ Exported fields and methods
○ Dependent classes
○ Implementing interfaces
● Generate bindings of all dependented
classes and interfaces
29
$ javap java.lang.String
Compiled from "String.java"
public final class java.lang.String implements java.io.Serializable,
java.lang.Comparable<java.lang.String>, java.lang.CharSequence {
public static final java.util.Comparator<java.lang.String>
CASE_INSENSITIVE_ORDER;
public java.lang.String();
....
Slide URL: https://goo.gl/OG55gT
Using Platform APIs from Go
● Example of Reverse Binding in x/mobile
30
$ cd $GOPATH/src/golang.org/x/mobile
$ cd example/reverse/android
$ gradle wrapper
$ ./gradlew build
$ cd build/outputs/apk
$ adb install -r android-debug.apk
Android Studio
also can build
Slide URL: https://goo.gl/OG55gT
Use Platform APIs from Go
● Use Activity and write in life cycle of
Android
31
type MainActivity struct {
app.AppCompatActivity
binding databinding.ActivityMainBinding
}
func (a *MainActivity) OnCreate(
this gopkg.MainActivity, b os.Bundle) {
...
}
func (a *MainActivity) OnDestroy(
this gopkg.MainActivity) {
...
}
reverse.go
Slide URL: https://goo.gl/OG55gT
Use Platform APIs from Go
● Use data binding of Android
32
func (a *MainActivity) OnCreate(
this gopkg.MainActivity, b os.Bundle) {
this.Super().OnCreate(b)
db := DataBindingUtil.SetContentView(
this, rlayout.Activity_main)
a.binding = ActivityMainBinding.Cast(db)
a.binding.SetAct(this)
}
func (a *MainActivity) GetLabel() string {
return "Hello, GopherCon India!"
}
reverse.go
Slide URL: https://goo.gl/OG55gT
Use Platform APIs from Go
● Use data binding of Android
33
...
<data>
<variable name="act"
type="reverse.MainActivity"/>
</data>
<RelativeLayout ...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{act.label}"/>
</RelativeLayout>
</layout>
activity_main.xml
Slide URL: https://goo.gl/OG55gT
Summaries
● The Basics of Go Mobile
○ Cross-compile / cgo for Android
○ What is Go Mobile?
○ SDK Apps and Native Apps
● Developing Android Apps in pure Go
○ gomobile bind
○ What is Reverse Bindings?
○ Use Platform APIs from Go
34
Thank you!
twitter: @tenntenn
Qiita: tenntenn
35
Slide URL: https://goo.gl/OG55gT
Binding between Go and Java
36
Package Abstruct Class
Struct Inner Class
Struct Field
Getter/Setter
(Native)
Method Method
(Native)
Package Function Static Method
Go Java
● gomobile bind generates bindings

More Related Content

PPTX
Rule 119 trial
PPTX
Revised penal code criminal law BOOK-2.pptx
PPTX
Criminal procedure
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
PDF
goパッケージで型情報を用いたソースコード検索を実現する
PDF
Cloud Functionsの紹介
PDF
Goにおける静的解析と製品開発への応用
PDF
Namespace API を用いたマルチテナント型 Web アプリの実践
Rule 119 trial
Revised penal code criminal law BOOK-2.pptx
Criminal procedure
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
goパッケージで型情報を用いたソースコード検索を実現する
Cloud Functionsの紹介
Goにおける静的解析と製品開発への応用
Namespace API を用いたマルチテナント型 Web アプリの実践

Viewers also liked (20)

PPTX
うしちゃん WebRTC Chat on SkyWayの開発コードw
PDF
Go静的解析ハンズオン
PDF
Javaトラブルに備えよう #jjug_ccc #ccc_h2
PDF
HTTP2 RFC 発行記念祝賀会
PDF
条件式評価器の実装による管理ツールの抽象化
PDF
粗探しをしてGoのコントリビューターになる方法
PDF
Go1.8 for Google App Engine
PDF
Static Analysis in Go
PDF
GoによるiOSアプリの開発
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PDF
Cloud functionsの紹介
PDF
HTTP2 時代の Web - web over http2
PDF
Google Assistant関係のセッションまとめ
PDF
オススメの標準・準標準パッケージ20選
PPTX
WebRTC Browsers n Stacks Implementation differences
PDF
Go入門
PDF
エキスパートGo
PDF
Go Friday 傑作選
PDF
メルカリ カウルのマスタデータの更新
PDF
Gopher Fest 2017参加レポート
うしちゃん WebRTC Chat on SkyWayの開発コードw
Go静的解析ハンズオン
Javaトラブルに備えよう #jjug_ccc #ccc_h2
HTTP2 RFC 発行記念祝賀会
条件式評価器の実装による管理ツールの抽象化
粗探しをしてGoのコントリビューターになる方法
Go1.8 for Google App Engine
Static Analysis in Go
GoによるiOSアプリの開発
メルカリ・ソウゾウでは どうGoを活用しているのか?
Cloud functionsの紹介
HTTP2 時代の Web - web over http2
Google Assistant関係のセッションまとめ
オススメの標準・準標準パッケージ20選
WebRTC Browsers n Stacks Implementation differences
Go入門
エキスパートGo
Go Friday 傑作選
メルカリ カウルのマスタデータの更新
Gopher Fest 2017参加レポート
Ad

Similar to Mobile Apps by Pure Go with Reverse Binding (20)

PDF
Go for Mobile Games
PDF
Gomobile: gophers in the land of Android
PDF
Develop Android app using Golang
PDF
Develop Android/iOS app using golang
PDF
Android is going to Go! Android and Golang
PDF
Android is going to Go! - Android and goland - Almog Baku
PDF
(Live) build and run golang web server on android.avi
PPTX
PPTX
PDF
Physical Computing Using Go and Arduino
PPTX
Android ndk - Introduction
PDF
Introduction to Google's Go programming language
PDF
Java to Golang: An intro by Ryan Dawson Seldon.io
PPTX
Ready, set, go! An introduction to the Go programming language
PPTX
Using the android ndk - DroidCon Paris 2014
PDF
Refactoring to GO modules
PDF
Android Native Development Kit
PDF
What's New in Hybrid App Development
PDF
Android Internals
PPT
Native Android for Windows Developers
Go for Mobile Games
Gomobile: gophers in the land of Android
Develop Android app using Golang
Develop Android/iOS app using golang
Android is going to Go! Android and Golang
Android is going to Go! - Android and goland - Almog Baku
(Live) build and run golang web server on android.avi
Physical Computing Using Go and Arduino
Android ndk - Introduction
Introduction to Google's Go programming language
Java to Golang: An intro by Ryan Dawson Seldon.io
Ready, set, go! An introduction to the Go programming language
Using the android ndk - DroidCon Paris 2014
Refactoring to GO modules
Android Native Development Kit
What's New in Hybrid App Development
Android Internals
Native Android for Windows Developers
Ad

More from Takuya Ueda (11)

PDF
Goにおけるバージョン管理の必要性 − vgoについて −
PDF
WebAssembly with Go
PDF
GAE/Goとsyncパッケージ
PDF
静的解析を使った開発ツールの開発
PDF
そうだ、Goを始めよう
PDF
マスター・オブ・goパッケージ
PDF
Goでかんたんソースコードの静的解析
PDF
Goでwebアプリを開発してみよう
PDF
GAE/GoでWebアプリ開発入門
PDF
GAE/GoでLINE Messaging API を使う
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Goにおけるバージョン管理の必要性 − vgoについて −
WebAssembly with Go
GAE/Goとsyncパッケージ
静的解析を使った開発ツールの開発
そうだ、Goを始めよう
マスター・オブ・goパッケージ
Goでかんたんソースコードの静的解析
Goでwebアプリを開発してみよう
GAE/GoでWebアプリ開発入門
GAE/GoでLINE Messaging API を使う
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法

Recently uploaded (20)

PPTX
Machine Learning_overview_presentation.pptx
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
1. Introduction to Computer Programming.pptx
PDF
Mushroom cultivation and it's methods.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Approach and Philosophy of On baking technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
A Presentation on Artificial Intelligence
PPTX
TLE Review Electricity (Electricity).pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
August Patch Tuesday
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Machine Learning_overview_presentation.pptx
Programs and apps: productivity, graphics, security and other tools
1. Introduction to Computer Programming.pptx
Mushroom cultivation and it's methods.pdf
Assigned Numbers - 2025 - Bluetooth® Document
Spectral efficient network and resource selection model in 5G networks
Diabetes mellitus diagnosis method based random forest with bat algorithm
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Approach and Philosophy of On baking technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
A Presentation on Artificial Intelligence
TLE Review Electricity (Electricity).pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
Unlocking AI with Model Context Protocol (MCP)
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
August Patch Tuesday
Digital-Transformation-Roadmap-for-Companies.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf

Mobile Apps by Pure Go with Reverse Binding

  • 1. Mobile Apps by Pure Go with Reverse Binding GopherCon India 22nd Feb. 2017 The Go gopher was designed by Renee French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. Slide URL: https://goo.gl/OG55gT
  • 2. Slide URL: https://goo.gl/OG55gT Who am I? Mercari, Inc./Souzoh, Inc. Takuya Ueda twitter: @tenntenn ■ Communities Google Cloud Platform User Group (GCPUG) Tokyo Go Beginners in Tokyo, Japan golang.tokyo Go Conference in Tokyo, Japan ■ Works Developing Mercari Atte in GAE/Go 2
  • 3. Slide URL: https://goo.gl/OG55gT What is this talk about? ● The Basics of Go Mobile ○ Cross-compile / cgo for Android ○ What is Go Mobile? ○ SDK Apps and Native Apps ● Developing Android Apps in pure Go ○ gomobile bind ○ What is Reverse Bindings? ○ Use Platform APIs from Go 3
  • 5. Slide URL: https://goo.gl/OG55gT Cross-compile ● GOOS and GOARCH ○ Go can cross-compile ○ GOOS indicates target OS ○ GOARCH indicates target architecture 5 # Build for 32bit Windows $ GOOS=windows GOARCH=386 go build # Build for arm Linux $ GOOS=linux GOARCH=arm go build A linux/arm binary also works on android devices.
  • 6. Slide URL: https://goo.gl/OG55gT Web server on Android Device 6 Watch at Youtube Source Code Android Shell on Mac adb shell
  • 7. Slide URL: https://goo.gl/OG55gT cgo ● C codes into Go codes 7 import "unsafe" /* #include <stdio.h> #include <stdlib.h> void hello(char *s) { printf("Hello, %sn", s); } */ import "C" func main() { str := C.CString("GopherCon India") C.hello(str) C.free(unsafe.Pointer(str)) } Comments before import "C" would be built as C codes Call C’s function from Go code
  • 8. Slide URL: https://goo.gl/OG55gT cgo for Android ● cgo codes also can be cross-compiled 8 $ CGO_ENABLED=1 CC=arm-linux-androideabi-gcc GOOS=android GOARCH=arm GOARM=7 go build -buildmode=pie hellocgo.go $ adb push hellocgo /data/local/tmp $ chmod 755 /data/local/tmp/hellocgo $ /data/local/tmp/hellocgo Hello, GopherCon India GOOS should be android when CGO_ENABLED is 1. Enable cgo at cross-compiling adb shell PC
  • 9. Slide URL: https://goo.gl/OG55gT buildmode ● Change output formats ○ archive, c-archive ■ build into C archive (.a file) ○ shared, c-shared ■ build into shared library (.so file) ○ plugin ■ bulid into Go Plugin (<= Go 1.8) ○ exe ■ build into executable file ○ pie ■ build into PIE style executable file 9 archive and shared ignore main package Go can build to .so files for Android
  • 10. Slide URL: https://goo.gl/OG55gT Go Mobile ● What is Go Mobile? ○ Go Mobile is a toolkit for Mobile Platform (Android and iOS) in Go. ● How Go Mobile works? ○ Go Mobile provides bindings of Android and iOS through cgo. 10 Go C Java Obj-C JNIcgo Android iOS
  • 11. Slide URL: https://goo.gl/OG55gT Go Mobile 11 https://github.com/golang/mobile
  • 12. Slide URL: https://goo.gl/OG55gT Installation ● Install gomobile comand ● Initialize the build tool chain ○ gomobile init initializes the build tool chain for mobile apps. 12 $ gomobile init -v $ ls $GOPATH/pkg/gomobile android_ndk_root pkg_android_amd64 pkg_android_arm64 pkg_darwin_arm version pkg_android_386 pkg_android_arm pkg_darwin_amd64 pkg_darwin_arm64 $ go get -u golang.org/x/mobile/cmd/gomobile
  • 13. Slide URL: https://goo.gl/OG55gT gomobile command gomobile command provides sub-commands. ● Sub-commands 13 bind build a library for Android and iOS build compile Android APK and iOS app clean remove object files and cached gomobile files init install android compiler toolchain install compile android APK and install on device version print version
  • 14. Slide URL: https://goo.gl/OG55gT SDK Apps and Native Apps Go Mobile provides two ways to develop mobile apps. ■ SDK Apps ● Write common funcations in Go as a library ■ Native Apps ● Write UI and all codes in Go 14
  • 15. Slide URL: https://goo.gl/OG55gT SDK Apps and Native Apps ● SDK Apps for Android ● Native Apps for Android 15 Go aar file Binding Classes (Java) Shared library (.so) Java UI, IAB, ... As a library gomobile bind apk file Go GoNativeActivity Shared library (.so)UI, audio, ... gomobile build
  • 16. Slide URL: https://goo.gl/OG55gT An Example of SDK Apps: Ivy ● Ivy big number calculator (source code) ○ Interpriter for APL-like language ○ Android App and iOS App use a same engine ○ The engine is written in Go by Rob Pike 16 Google Play App Store
  • 17. Slide URL: https://goo.gl/OG55gT An Example of Native Apps ● Flappy Gopher ○ A mobile game written in Go Mobile ○ Developed by Andrew Gerrand for Go Conference 2015 Winter ○ Source Code 17
  • 19. Slide URL: https://goo.gl/OG55gT gomobile bind ● Generate an Android Archive (.aar) ○ a shared library (.so) written in Go ○ a JAR file which is bult Java bindings ● Develop with Android Studio Plugin ○ Runs gomobile bind ○ Links to a generated .aar file 19 $ gomobile bind [-target ios|android] mypkg
  • 20. Slide URL: https://goo.gl/OG55gT Contents of an AAR file 20 $ gomobile bind sample $ unzip -Z1 sample.aar AndroidManifest.xml proguard.txt classes.jar jni/armeabi-v7a/libgojni.so jni/arm64-v8a/libgojni.so jni/x86/libgojni.so jni/x86_64/libgojni.so R.txt res/ Compiled Java codes Compiled Go/C codes
  • 21. Slide URL: https://goo.gl/OG55gT Calling Go code from Java code 21 Bindings Java codes Application Codes (Java) C codes Go/cgo codes JNI Generated by gomobile bind SDK Codes (Go) cgo
  • 22. Slide URL: https://goo.gl/OG55gT An Example of Bindings 22 package sample func Hello() string { return "Hello" } type MyStruct struct { Str string } func (s MyStruct) MyMethod() string { return s.Str } public abstract class Sample { // ... private Sample() {} // uninstantiable public static final class MyStruct extends Seq.Proxy { public final native String getStr(); public final native void setStr(String v); public native String MyMethod(); // ... } public static native String Hello(); } Java Go Struct Field Method Package Function
  • 23. Slide URL: https://goo.gl/OG55gT Type restrictions ● Signed integer and floating point type ● String and boolean type ● Byte slice type ● Any functions ○ parameter and result types must be supported types ○ results are 0, 1 or 2 (2nd result must be an error type) ● Any struct type ○ all fields and methods must be supported types ● Any interface ○ all methods must be supported types 23
  • 24. Slide URL: https://goo.gl/OG55gT Calling Platform API from Go ● In-app Billing ○ Purchase a items in the game ● SNS connection ○ Facebook, Twitter, ... ● Advertisements ● Analytics ○ Google Analytics, Firebase, Facebook Analytics,... 24 These APIs are provided as Java SDK for Android
  • 25. Slide URL: https://goo.gl/OG55gT Traditional gomobile bind ● Bindings to Go from Java/Obj-C ● Platform APIs can be accessed BUT... ○ Indirect way ○ Needs wrappers ○ Not convenient 25 A way to access directly Platform APIs from Go is needed!
  • 26. Slide URL: https://goo.gl/OG55gT Reverse Bindings ● Access Platform APIs from Go ● Generate bindings automatically ○ Reverse direction of traditional one ○ use gomobile bind ● Prposed by #16876 and #17102 (Android) (iOS) 26
  • 27. Slide URL: https://goo.gl/OG55gT Reverse Bindings 27 Bindings Java codes Go Codes C codes Go/cgo codes JNI Generated by gomobile bind Platform APIs (Java) cgo
  • 28. Slide URL: https://goo.gl/OG55gT An Example of Reverse Bindings 28 package pkg import "Java/java/lang" import "Java/pkg" type Obj struct { lang.Object } func (h *Obj) ToString(this *pkg.Obj) string { return "hoge" } ● Parse import statements ○ Java/* or ObjC/* ● Generate bindings automatically corresponds java.lang package in Java inherit java.lang.Object Hold a Java instance
  • 29. Slide URL: https://goo.gl/OG55gT How Generate Reverse Bindings? ● Parse import statements ○ Begin with Java/ ● Extract class infomation by javap ○ Exported fields and methods ○ Dependent classes ○ Implementing interfaces ● Generate bindings of all dependented classes and interfaces 29 $ javap java.lang.String Compiled from "String.java" public final class java.lang.String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence { public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER; public java.lang.String(); ....
  • 30. Slide URL: https://goo.gl/OG55gT Using Platform APIs from Go ● Example of Reverse Binding in x/mobile 30 $ cd $GOPATH/src/golang.org/x/mobile $ cd example/reverse/android $ gradle wrapper $ ./gradlew build $ cd build/outputs/apk $ adb install -r android-debug.apk Android Studio also can build
  • 31. Slide URL: https://goo.gl/OG55gT Use Platform APIs from Go ● Use Activity and write in life cycle of Android 31 type MainActivity struct { app.AppCompatActivity binding databinding.ActivityMainBinding } func (a *MainActivity) OnCreate( this gopkg.MainActivity, b os.Bundle) { ... } func (a *MainActivity) OnDestroy( this gopkg.MainActivity) { ... } reverse.go
  • 32. Slide URL: https://goo.gl/OG55gT Use Platform APIs from Go ● Use data binding of Android 32 func (a *MainActivity) OnCreate( this gopkg.MainActivity, b os.Bundle) { this.Super().OnCreate(b) db := DataBindingUtil.SetContentView( this, rlayout.Activity_main) a.binding = ActivityMainBinding.Cast(db) a.binding.SetAct(this) } func (a *MainActivity) GetLabel() string { return "Hello, GopherCon India!" } reverse.go
  • 33. Slide URL: https://goo.gl/OG55gT Use Platform APIs from Go ● Use data binding of Android 33 ... <data> <variable name="act" type="reverse.MainActivity"/> </data> <RelativeLayout ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{act.label}"/> </RelativeLayout> </layout> activity_main.xml
  • 34. Slide URL: https://goo.gl/OG55gT Summaries ● The Basics of Go Mobile ○ Cross-compile / cgo for Android ○ What is Go Mobile? ○ SDK Apps and Native Apps ● Developing Android Apps in pure Go ○ gomobile bind ○ What is Reverse Bindings? ○ Use Platform APIs from Go 34
  • 36. Slide URL: https://goo.gl/OG55gT Binding between Go and Java 36 Package Abstruct Class Struct Inner Class Struct Field Getter/Setter (Native) Method Method (Native) Package Function Static Method Go Java ● gomobile bind generates bindings