Merge branch 'fix/recents-wipe-jni-null-view'

Guard against Gio's null-view detach event (recents-wipe SIGABRT).
This commit is contained in:
Greg Pomerantz 2026-08-20 23:35:08 -04:00
commit 9f32185b78
2 changed files with 17 additions and 0 deletions

View File

@ -225,6 +225,15 @@ func NewBLE() *BLE {
//Enable //Enable
func (b *BLE) Enable(view uintptr) { func (b *BLE) Enable(view uintptr) {
log.Printf("ble.Enable()") 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()) setJVM(app.JavaVM())
runInJVM(func(env *JNIEnv) { runInJVM(func(env *JNIEnv) {
log.Printf("ble.Enable(): inside runInJVM()") log.Printf("ble.Enable(): inside runInJVM()")

View File

@ -5,6 +5,14 @@
void void
registerFragment(JNIEnv *env, jobject view) { 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); jclass cls = (*env)->GetObjectClass(env, view);
jmethodID mid = (*env)->GetMethodID(env, cls, "getContext", "()Landroid/content/Context;"); jmethodID mid = (*env)->GetMethodID(env, cls, "getContext", "()Landroid/content/Context;");
jobject ctx = (*env)->CallObjectMethod(env, view, mid); jobject ctx = (*env)->CallObjectMethod(env, view, mid);