diff --git a/ble_android.go b/ble_android.go index 81f130a..493730b 100644 --- a/ble_android.go +++ b/ble_android.go @@ -225,6 +225,15 @@ func NewBLE() *BLE { //Enable func (b *BLE) Enable(view uintptr) { log.Printf("ble.Enable()") + // view == 0 is Gio's detach signal (GioView.onDestroyView sends + // ViewEvent{View: 0} when the view is destroyed, e.g. the activity + // going away on a recents-wipe). Nothing to register; passing the null + // ref on would abort in JNI (GetObjectClass on null). A re-attach + // arrives as a fresh event with a live view. Callers that forward the + // event unfiltered are protected by this guard. + if view == 0 { + return + } setJVM(app.JavaVM()) runInJVM(func(env *JNIEnv) { log.Printf("ble.Enable(): inside runInJVM()") diff --git a/jni_android.c b/jni_android.c index 8c3331e..8af028f 100644 --- a/jni_android.c +++ b/jni_android.c @@ -5,6 +5,14 @@ void registerFragment(JNIEnv *env, jobject view) { + if (view == NULL) { + // Detach signal (Gio sends ViewEvent{View: 0} when the view is + // destroyed, e.g. the activity going away on a recents-wipe). + // The Go side already filters these; this guard keeps the JNI + // calls safe if one ever slips through (GetObjectClass on null + // aborts the process). + return; + } jclass cls = (*env)->GetObjectClass(env, view); jmethodID mid = (*env)->GetMethodID(env, cls, "getContext", "()Landroid/content/Context;"); jobject ctx = (*env)->CallObjectMethod(env, view, mid);