2. This work by SeongJae Park is licensed under the Creative
Commons Attribution-ShareAlike 3.0 Unported License. To
view a copy of this license, visit http://creativecommons.
org/licenses/by-sa/3.0/.
3. This slides were presented during
GopherCon Korea 2015
(https://plus.google.com/u/0/events/c4b79ocq4k9ac11bpb5b2govkes)
4. Nice To Meet You
SeongJae Park
sj38.park@gmail.com
golang newbie programmer
5. Warning
● This speech could be useless for you
○ The speaker is doing this just for fun
https://github.com/golang/mobile/raw/master/doc/caution.png
6. Warning
● This speech could be useless for you
○ The speaker is doing this just for fun
● Don’t try this at office carelessly
○ It’s an experiment yet
https://github.com/golang/mobile/raw/master/doc/caution.png
7. Java is Dangerous, Now
● Oracle may take Java away from Android
● Swift is open source now, but...
● We need alternatives
http://img.talkandroid.com/uploads/2011/10/OracleGoogle.jpg
8. golang: Programming Language
● For simple, reliable, and efficient software.
http://blog.golang.org/5years/gophers5th.jpg
9. golang: Programming Language
● For simple, reliable, and efficient software.
● Could it be used for simple, reliable, efficient,
and free mobile application?
http://blog.golang.org/5years/gophers5th.jpg
10. Golang on Mobile
● Golang supports Android from v1.4
● Golang supports iOS from v1.5
○ Though it’s still in experimental stage, there were
many improvements especially in tools
● https://github.com/golang/mobile
○ Repo of packages and tools for Go on Mobile
11. Goal of This Speak
● Showing how we can use golang on Mobile
○ Focus on Android, rather than iOS
(Speaker has no iPhone…)
○ By exploring example code
12. Goal of This Speak
● Showing how we can use golang on Mobile
○ Focus on Android, rather than iOS
(Speaker has no iPhone…)
○ By exploring example code
● We will explore code based on go1.4, go1.5
○ Code based on go1.4 shows naked face of build
process
■ based on go1.4: https://github.com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f5725a5cbcd6b
■ based on go1.5: https://github.com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c555366d20
17. Main Idea: NDK
● c / c++ only apk is available
using NativeActivity
○ Golang is a compiled language, too. Why not?
http://www.android.pk/images/android-ndk.jpg
18. Main Idea: NDK
● c / c++ only apk is available
using NativeActivity
○ Golang is a compiled language, too. Why not?
Plan is as below:
● Build golang program as .so file
○ ELF shared object
● Process events(draw, touch, …) via OpenGL
● Build NativeActivity apk using NDK / SDK
http://www.android.pk/images/android-ndk.jpg
26. Build Process
Build golang code into ELF shared object for
ARM
mkdir -p jni/armeabi
CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7
go build -ldflags="-shared" -o jni/armeabi/libbasic.so .
ndk-build NDK_DEBUG=1
ant debug
(mobile/example/basic/make.bash)
27. Build Process
Build golang code into ELF shared object for
ARM
NDK to add the so file
mkdir -p jni/armeabi
CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7
go build -ldflags="-shared" -o jni/armeabi/libbasic.so .
ndk-build NDK_DEBUG=1
ant debug
(mobile/example/basic/make.bash)
28. Build Process
Build golang code into ELF shared object for
ARM
NDK to add the so file
SDK to build apk file
mkdir -p jni/armeabi
CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7
go build -ldflags="-shared" -o jni/armeabi/libbasic.so .
ndk-build NDK_DEBUG=1
ant debug
(mobile/example/basic/make.bash)
29. Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
gomobile command do build
$ tree
.
└── main.go
0 directories, 1 file
30. Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
gomobile command do build
$ go get golang.org/x/mobile/cmd/gomobile
$ tree
.
└── main.go
0 directories, 1 file
31. Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
gomobile command do build
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init # install ndk if needed
$ tree
.
└── main.go
0 directories, 1 file
32. Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
gomobile command do build
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init # install ndk if needed
$ gomobile build -target=android golang.org/x/mobile/example/basic
$ tree
.
└── main.go
0 directories, 1 file
33. Pure Golang Android App
Pros: No more JAVA! Yay!!!
Cons: Should I learn OpenGL to show a cat?
35. Main Idea: Gives binding
Java and C language connected via JNI
Java
C
JNI
36. Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
Java
C GO
JNI
CGO
37. Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
ObjC(Objective C) is a super-set of C language
Java
C GO
JNI
CGO
ObjC
38. Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
ObjC(Objective C) is a super-set of C language
Golang supports Java/ObjC-Golang bind
(Uses Cgo internally)
Java
C GO
JNI
CGO
bind
ObjC
bind
39. Example Code (1.4 based)
https://github.
com/golang/mobile/tree/40f92
f7d9f9092072ea68570fd6f572
5a5cbcd6b/example/libhello
40. Example Code (1.4 based)
https://github.
com/golang/mobile/tree/40f92
f7d9f9092072ea68570fd6f572
5a5cbcd6b/example/libhello
$ tree
.
├── all.bash
├── all.bat
├── AndroidManifest.xml
├── build.xml
├── hi
│ ├── go_hi
│ │ └── go_hi.go
│ └── hi.go
├── main.go
├── make.bash
├── make.bat
├── README
└── src
├── com
│ └── example
│ └── hello
│ └── MainActivity.java
└── go
└── hi
└── Hi.java
8 directories, 12 files
41. Callee in Go
Golang code is implementing Hello() function
func Hello(name string) {
fmt.Printf("Hello, %s!n", name)
}
(mobile/example/libhello/hi/hi.go)
43. gobind
generate language bindings that make it
possible to call Go code and pass objects from
Java
$ go install golang.org/x/mobile/cmd/gobind
$ gobind -lang=go github.com/libhello/hi > hi/go_hi/go_hi.go # stub
$ gobind -lang=java github.com/libhello/hi > src/go/hi/Hi.java # proxy
44. gobind: Generated Proxy java Code
Provides wrapper function for golang calling
code
public static void Hello(String name) {
go.Seq _in = new go.Seq();
go.Seq _out = new go.Seq();
_in.writeUTF16(name);
Seq.send(DESCRIPTOR, CALL_Hello, _in, _out);
}
private static final int CALL_Hello = 1;
private static final String DESCRIPTOR = "hi";
(mobile/example/libhello/src/go/hi/Hi.java)
45. gobind: Generated Stub go Code
Provides proxy and registering for the exported
function
func proxy_Hello(out, in *seq.Buffer) {
param_name := in.ReadUTF16()
hi.Hello(param_name)
}
func init() {
seq.Register("hi", 1, proxy_Hello)
}
(mobile/example/libhello/hi/go_hi/go_hi.go)
50. Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of Linux system with ARM
x86 Androids exist, though...
51. Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of Linux system with ARM
x86 Androids exist, though...
Go supports ARM & Linux Officially
with static-linking
52. Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of Linux system with ARM
x86 Androids exist, though...
Go supports ARM & Linux Officially
with static-linking
Remember the philosophy of Unix
Not tested for iOS
55. Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
56. Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app
57. Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app
3. Copy the binary in private space of the app
58. Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app
3. Copy the binary in private space of the app
4. Give execute permission to the binary
/data/data/com.example.goRunner/files # ls -al
-rwxrwxrwx u0_a55 u0_a55 4512840 2014-11-28 17:45 gobin
59. Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app
3. Copy the binary in private space of the app
4. Give execute permission to the binary
5. Execute it
/data/data/com.example.goRunner/files # ls -al
-rwxrwxrwx u0_a55 u0_a55 4512840 2014-11-28 17:45 gobin
60. Go bin Loading
Load golang program from assets to private dir
private void copyGoBinary() {
String dstFile = getBaseContext().getFilesDir().getAbsolutePath() + "/verChecker.bin";
try {
InputStream is = getAssets().open("go.bin");
FileOutputStream fos = getBaseContext().openFileOutput(
"verChecker.bin", MODE_PRIVATE);
byte[] buf = new byte[8192];
int offset;
while ((offset = is.read(buf)) > 0) {
fos.write(buf, 0, offset);
}
Runtime.getRuntime().exec("chmod 0777 " + dstFile);
} catch (IOException e) { }
}
61. Execute Go process
Spawn new process for the program and
communicates using stdio
ProcessBuilder pb = new ProcessBuilder();
pb.command(goBinPath());
pb.redirectErrorStream(false);
goProcess = pb.start();
new CopyToAndroidLogThread("stderr",
goProcess.getErrorStream())
.start();
63. Inter Process Communication
Pros: Just normal unix way
Golang team is using this for Camlistore
(https://github.com/camlistore/camlistore)
64. Inter Process Communication
Pros: Just normal unix way
Golang team is using this for Camlistore
(https://github.com/camlistore/camlistore)
Cons: Hacky, a little
x/mobile is comfortable enough, now
Not sure whether it works on iOS
65. Summary
● Go can run on Mobile
○ As a native application,
○ as a library,
○ or, as a process
● Though it’s an experiment yet, it’s fairly
comfortable