diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 627fcbf0a1dc3..5182a7700ef89 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -590,9 +590,19 @@ static void android_os_Binder_destroy(JNIEnv* env, jobject clazz) { JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetIntField(clazz, gBinderOffsets.mObject); - env->SetIntField(clazz, gBinderOffsets.mObject, 0); - LOGV("Java Binder %p: removing ref on holder %p", clazz, jbh); - jbh->decStrong(clazz); + if (jbh != NULL) { + env->SetIntField(clazz, gBinderOffsets.mObject, 0); + LOGV("Java Binder %p: removing ref on holder %p", clazz, jbh); + jbh->decStrong(clazz); + } else { + // Encountering an uninitialized binder is harmless. All it means is that + // the Binder was only partially initialized when its finalizer ran and called + // destroy(). The Binder could be partially initialized for several reasons. + // For example, a Binder subclass constructor might have thrown an exception before + // it could delegate to its superclass's constructor. Consequently init() would + // not have been called and the holder pointer would remain NULL. + LOGV("Java Binder %p: ignoring uninitialized binder", clazz); + } } // ----------------------------------------------------------------------------