When passing a byte array from Java to Go, Seq.writeByteArray JNI call encodes only the array size and the pointer to the array. Go-side receives the (size, ptr) pair info during the subsequent Seq.send JNI call, and copies the elements into a Go byte slice. We must pin the array elements until Go-side completes copying so that they are not moved or collected by Java runtime. This change keeps track of the pinned array info in a 'pinned' linked list, and unpin them as the Seq memory is freed. The jbyteArray argument passed to Seq.writeByteArray is needed to release the pinned byte array elements, but that is a "local reference". It is not guaranteed that the reference is valid after the method returns. Thus, we stash its global reference in the 'pinned' list and delete it later as well. A similar problem can occur on the byte slice returned from a Go function. This change does not address the case yet. Fixes golang/go#9486 Change-Id: I1255aefbc80b21ccbe9b2bf37699faaf0c5f0bae Reviewed-on: https://go-review.googlesource.com/2586 Reviewed-by: David Crawshaw <crawshaw@golang.org>
Go support for Mobile devices
The Go mobile repository holds packages and build tools for using Go on Android.
This is early work and the build system is a bumpy ride. Building a binary for Android requires using a Go cross compiler and an external linker from the NDK.
For now, the easiest way to setup a build environment is using the provided Dockerfile:
docker pull golang/mobile
Get the sample applications.
go get -d golang.org/x/mobile/example/...
In your app directory under your $GOPATH
, copy the following files from either
the golang.org/x/mobile/example/basic
or golang.org/x/mobile/example/libhello
apps:
AndroidManifest.xml
all.bash
build.xml
jni/Android.mk
make.bash
Start with basic
if you are writing an all-Go application (that is, an OpenGL game)
or libhello if you are building a .so
file for use from Java via
gobind. Edit the files to change
the name of your app.
To build, run:
docker run -v $GOPATH/src:/src mobile /bin/bash -c 'cd /src/your/project && ./make.bash'
Note the use of -v option to mount $GOPATH/src to /src of the container. The above command will fail if the -v option is missing or the specified volume is not accessible from the container.
When working with an all-Go application, this will produce a binary at
$GOPATH/src/your/project/bin/name-debug.apk
. You can use the adb tool to install
and run this app. See all.bash for an example.
--
APIs are currently very limited, but under active development. Package documentation serves as a starting point:
Contributions to Go are appreciated. See https://golang.org/doc/contribute.html.