OSDN Git Service

Fix JNI GetSuperClasss
authorBrian Carlstrom <bdc@google.com>
Fri, 22 May 2015 20:43:00 +0000 (13:43 -0700)
committerBrian Carlstrom <bdc@google.com>
Thu, 4 Jun 2015 16:23:11 +0000 (09:23 -0700)
Change-Id: I005e9f84220dabfcea7cbc7b7b0ad422dd435a40

runtime/jni_internal.cc
runtime/jni_internal_test.cc
runtime/mirror/class.h

index 6ab4455..cb36183 100644 (file)
@@ -406,7 +406,7 @@ class JNI {
     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
index 99eb365..2a0cb28 100644 (file)
@@ -1238,7 +1238,7 @@ TEST_F(JniInternalTest, GetSuperclass) {
   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;
index ba8a693..551e7e2 100644 (file)
@@ -1207,7 +1207,12 @@ class MANAGED Class FINAL : public Object {
   // 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.