Go on Android
A preview

DroidCon
20 Sep 2014

David Crawshaw
Google
@davidcrawshaw

* A brief introduction to Go

* What is Go

Go is a general purpose programming language.

Born out of frustration with C++ and Java:
- Slow builds
- Too much complexity

Go is fast and simple.

More at: [[https://go.dev/talks/2012/splash.article]]

* Five years later

Go is not driven by a platform.
Sinks or swims on its own merits.

.image droidcon/gopherswim.jpg

Many users, e.g.
SoundCloud, Docker, Secret, The New York Times

"The cloud programming language."

* Beyond Cloud

Go has found other uses.

Popular on embedded linux systems.
PayPal's Beacon hardware is powered by Go.

Large-scale data analysis.

For many of us, it replaces python/perl/ruby.

Where else can we use Go?
What about phones and tablets?

* Go on Android

Android UI programming needs lots of Java APIs.
My first experiment was using these from Go.

It did not work.
Using Java APIs in Go is writing Java using Go syntax.

"You can write FORTRAN in any language"

So does it ever make sense to use Go on Android?
Yes, for portability.

* Portability

Lots of apps are written for more than just Android.
Some apps start elsewhere and never make it to Android.

:-(

Today, developers solve platform portability with C++.
We can do better.

* Two ways to use Go

1. Write libraries in Go, use them from Java apps. Or Objective-C/Swift apps.

2. Write apps entirely in Go, restricted to a set of common APIs across platforms.

.image droidcon/gopherswrench.jpg

* Go libraries for apps

* Cross language interfaces

Java is a silo.

To use another language, you need JNI.
JNI is tricky, buggy, painful.
It keeps Java programmers away from many good things.

So, no JNI.

Instead, we have a tool for that: `gobind`
It generates Java interfaces for you.

[[http://golang.org/s/gobind]]

* gobind basics

	package hi

	import "fmt"

	func Hello(name string) {
		fmt.Println("Hello, %s!\n", name)
	}

Use `gobind` on package `hi` to generate Go helper code and a Java interface:


	package go;

	public abstract class Hi {
		public static final void Hello(String name) { .. }
	}

Invoke from Java:

	Hi.Hello("DroidCon")

* gobind features

Today, gobind supports many basic Go types, structs, and callbacks.

When finished, `gobind` will support *all* Go types.

Go's simplicity makes language bindings simple.
For C++, SWIG has many hard-to-use features.

With Go we get configuration-free language bindings.
SWIG without the .swig files.

* All-Go apps

* NDK-style interfaces

Go will have common libraries:

- Touch events
- OpenGL
- Basic app management

In general: if it works on the NDK and iOS, it works in Go.

* Games

The primary target for pure Go apps is games.

Better control over over allocation means fewer
garbage collector problems.

Unlikely language for high-budget 3D engines.
But lots of games can be written in Go.

But we are building a 2D sprite package.

* Status: 2014

Android OS support will be built into the Go runtime in the December 1.4 release.

First version available from the `go.mobile` subrepository of

- `gobind`
- OpenGL ES 2 bindings
- touch events package
- limited android build integration

Sprite library will be in early testing.

Setup will still be a little trickier than I want, but it will work.

* Demo

* Roadmap: mid-2015

The plan is iOS support will be in the Go runtime July 1.5 release.

The same OpenGL bindings and touch events package will work. The `gobind` tool will generate Objective-C/Swift bindings.

Sprite will be ready for 2D games.

* Questions

* Backup slides

* Go compared to Java

- pointers
- generate less garbage

	type Point struct {
		X float64
		Y float64
	}

	type Points []Point

- `map[int]int` is efficient like `android.os.SparseIntArray`
- `map[int]float32` is efficient like `android.os.?`
- focus on functions, simplicity
- native binaries

More at: [[https://go.dev/talks/2014/go4java.slide]]
