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
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;
// 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.