diff --git a/app/app.go b/app/app.go index 71bc57be..9a18ec42 100644 --- a/app/app.go +++ b/app/app.go @@ -9,6 +9,13 @@ import ( "gioui.org/app/internal/window" ) +type Handle window.Handle + +// PlatformHandle returns the platform specific Handle. +func PlatformHandle() *Handle { + return (*Handle)(window.PlatformHandle) +} + // extraArgs contains extra arguments to append to // os.Args. The arguments are separated with |. // Useful for running programs on mobiles where the diff --git a/app/internal/window/GioView.java b/app/internal/window/GioView.java index 4cb92603..521e82bc 100644 --- a/app/internal/window/GioView.java +++ b/app/internal/window/GioView.java @@ -46,7 +46,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback throw new RuntimeException(e); } System.loadLibrary("gio"); - runGoMain(dataDirUTF8); + runGoMain(dataDirUTF8, appCtx); jniLoaded = true; } } @@ -219,7 +219,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback static private native void onFrameCallback(long handle, long nanos); static private native boolean onBack(long handle); static private native void onFocusChange(long handle, boolean focus); - static private native void runGoMain(byte[] dataDir); + static private native void runGoMain(byte[] dataDir, Context context); private static class InputConnection extends BaseInputConnection { private final Editable editable; diff --git a/app/internal/window/handle.go b/app/internal/window/handle.go new file mode 100644 index 00000000..5d7b1a1f --- /dev/null +++ b/app/internal/window/handle.go @@ -0,0 +1,7 @@ +// +build !android + +package window + +var PlatformHandle *Handle + +type Handle struct{} diff --git a/app/internal/window/handle_android.go b/app/internal/window/handle_android.go new file mode 100644 index 00000000..d35ccb98 --- /dev/null +++ b/app/internal/window/handle_android.go @@ -0,0 +1,11 @@ +package window + +var PlatformHandle *Handle + +type Handle struct { + // JVM is the JNI *JVM pointer. + JVM uintptr + // Context is a global reference to the application's + // android.content.Context instance. + Context uintptr +} diff --git a/app/internal/window/os_android.c b/app/internal/window/os_android.c index 30d8e728..f8d25b6e 100644 --- a/app/internal/window/os_android.c +++ b/app/internal/window/os_android.c @@ -22,7 +22,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { static const JNINativeMethod methods[] = { { .name = "runGoMain", - .signature = "([B)V", + .signature = "([BLandroid/content/Context;)V", .fnPtr = runGoMain }, { diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index 850b010f..74632ce9 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -80,7 +80,7 @@ func jniGetStaticMethodID(env *C.JNIEnv, class C.jclass, method, sig string) C.j } //export runGoMain -func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray) { +func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray, context C.jobject) { dirBytes := C.gio_jni_GetByteArrayElements(env, jdataDir) if dirBytes == nil { panic("runGoMain: GetByteArrayElements failed") @@ -89,6 +89,12 @@ func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray) { dataDir := C.GoStringN((*C.char)(unsafe.Pointer(dirBytes)), n) dataDirChan <- dataDir C.gio_jni_ReleaseByteArrayElements(env, jdataDir, dirBytes) + context = C.gio_jni_NewGlobalRef(env, context) + + PlatformHandle = &Handle{ + JVM: uintptr(unsafe.Pointer(theJVM)), + Context: uintptr(context), + } runMain() }