Fix JNI GetSuperClasss
Change-Id: I005e9f84220dabfcea7cbc7b7b0ad422dd435a40
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc
index 6ab4455..cb36183 100644
--- a/runtime/jni_internal.cc
+++ b/runtime/jni_internal.cc
@@ -406,7 +406,7 @@
CHECK_NON_NULL_ARGUMENT(java_class);
ScopedObjectAccess soa(env);
mirror::Class* c = soa.Decode<mirror::Class*>(java_class);
- return soa.AddLocalReference<jclass>(c->GetSuperClass());
+ return soa.AddLocalReference<jclass>(c->IsInterface() ? nullptr : c->GetSuperClass());
}
// Note: java_class1 should be safely castable to java_class2, and
diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc
index 99eb365..2a0cb28 100644
--- a/runtime/jni_internal_test.cc
+++ b/runtime/jni_internal_test.cc
@@ -1238,7 +1238,7 @@
ASSERT_NE(runnable_interface, nullptr);
ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(string_class)));
ASSERT_EQ(env_->GetSuperclass(object_class), nullptr);
- ASSERT_TRUE(env_->IsSameObject(object_class, env_->GetSuperclass(runnable_interface)));
+ ASSERT_EQ(env_->GetSuperclass(runnable_interface), nullptr);
// Null as class should fail.
CheckJniAbortCatcher jni_abort_catcher;
diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h
index ba8a693..551e7e2 100644
--- a/runtime/mirror/class.h
+++ b/runtime/mirror/class.h
@@ -1207,7 +1207,12 @@
// Descriptor for the class such as "java.lang.Class" or "[C". Lazily initialized by ComputeName
HeapReference<String> name_;
- // The superclass, or null if this is java.lang.Object, an interface or primitive type.
+ // The superclass, or null if this is java.lang.Object or a primitive type.
+ //
+ // Note that interfaces have java.lang.Object as their
+ // superclass. This doesn't match the expectations in JNI
+ // GetSuperClass or java.lang.Class.getSuperClass() which need to
+ // check for interfaces and return null.
HeapReference<Class> super_class_;
// If class verify fails, we must return same error on subsequent tries.