From 0c0a22bee73cd552c6c6c861d2a92edabea7ab6d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 5 May 2020 18:55:14 +0200 Subject: [PATCH] app/internal/window: don't rely on JNI_OnCreate for getting the JavaVM We're about to remove the global JNI_OnLoad constructor, and the JavaVM singleton is just as easily fetched from a Java JNI callback. Signed-off-by: Elias Naur --- app/internal/window/os_android.c | 6 ++++-- app/internal/window/os_android.go | 8 +++----- app/internal/window/os_android.h | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/internal/window/os_android.c b/app/internal/window/os_android.c index 8d0c9588..63448e9b 100644 --- a/app/internal/window/os_android.c +++ b/app/internal/window/os_android.c @@ -10,8 +10,6 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { return -1; } - setJVM(vm); - jclass viewClass = (*env)->FindClass(env, "org/gioui/GioView"); if (viewClass == NULL) { return -1; @@ -105,6 +103,10 @@ jint gio_jni_GetEnv(JavaVM *vm, JNIEnv **env, jint version) { return (*vm)->GetEnv(vm, (void **)env, version); } +jint gio_jni_GetJavaVM(JNIEnv *env, JavaVM **jvm) { + return (*env)->GetJavaVM(env, jvm); +} + jint gio_jni_AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args) { return (*vm)->AttachCurrentThread(vm, p_env, thr_args); } diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index ae47a6ed..85b46ad8 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -88,6 +88,9 @@ 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, context C.jobject) { + if res := C.gio_jni_GetJavaVM(env, &theJVM); res != 0 { + panic("gio: GetJavaVM failed") + } dirBytes := C.gio_jni_GetByteArrayElements(env, jdataDir) if dirBytes == nil { panic("runGoMain: GetByteArrayElements failed") @@ -113,11 +116,6 @@ func GetDataDir() string { return <-dataDirChan } -//export setJVM -func setJVM(vm *C.JavaVM) { - theJVM = vm -} - //export onCreateView func onCreateView(env *C.JNIEnv, class C.jclass, view C.jobject) C.jlong { view = C.gio_jni_NewGlobalRef(env, view) diff --git a/app/internal/window/os_android.h b/app/internal/window/os_android.h index 321d7596..db34ad3b 100644 --- a/app/internal/window/os_android.h +++ b/app/internal/window/os_android.h @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Unlicense OR MIT __attribute__ ((visibility ("hidden"))) jint gio_jni_GetEnv(JavaVM *vm, JNIEnv **env, jint version); +__attribute__ ((visibility ("hidden"))) jint gio_jni_GetJavaVM(JNIEnv *env, JavaVM **jvm); __attribute__ ((visibility ("hidden"))) jint gio_jni_AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args); __attribute__ ((visibility ("hidden"))) jint gio_jni_DetachCurrentThread(JavaVM *vm);