diff options
| -rw-r--r-- | runtime/check_jni.cc | 2 | ||||
| -rw-r--r-- | test/JniTest/JniTest.java | 21 | ||||
| -rw-r--r-- | test/JniTest/jni_test.cc | 16 |
3 files changed, 38 insertions, 1 deletions
diff --git a/runtime/check_jni.cc b/runtime/check_jni.cc index 54f314391b..3b1bda41bc 100644 --- a/runtime/check_jni.cc +++ b/runtime/check_jni.cc @@ -335,7 +335,7 @@ class ScopedCheck { return; } mirror::Class* c = soa_.Decode<mirror::Class*>(java_class); - if (!c->IsAssignableFrom(m->GetDeclaringClass())) { + if (!m->GetDeclaringClass()->IsAssignableFrom(c)) { JniAbortF(function_name_, "can't call static %s on class %s", PrettyMethod(m).c_str(), PrettyClass(c).c_str()); } diff --git a/test/JniTest/JniTest.java b/test/JniTest/JniTest.java index 431056ae32..7014ef9334 100644 --- a/test/JniTest/JniTest.java +++ b/test/JniTest/JniTest.java @@ -18,7 +18,28 @@ class JniTest { public static void main(String[] args) { System.loadLibrary("arttest"); testFindClassOnAttachedNativeThread(); + testCallStaticVoidMethodOnSubClass(); } private static native void testFindClassOnAttachedNativeThread(); + + private static void testCallStaticVoidMethodOnSubClass() { + testCallStaticVoidMethodOnSubClassNative(); + if (!testCallStaticVoidMethodOnSubClass_SuperClass.executed) { + throw new AssertionError(); + } + } + + private static native void testCallStaticVoidMethodOnSubClassNative(); + + private static class testCallStaticVoidMethodOnSubClass_SuperClass { + private static boolean executed = false; + private static void execute() { + executed = true; + } + } + + private static class testCallStaticVoidMethodOnSubClass_SubClass + extends testCallStaticVoidMethodOnSubClass_SuperClass { + } } diff --git a/test/JniTest/jni_test.cc b/test/JniTest/jni_test.cc index ed69d39d27..72a3309d9d 100644 --- a/test/JniTest/jni_test.cc +++ b/test/JniTest/jni_test.cc @@ -54,6 +54,7 @@ static void* testFindClassOnAttachedNativeThread(void*) { return NULL; } +// http://b/10994325 extern "C" JNIEXPORT void JNICALL Java_JniTest_testFindClassOnAttachedNativeThread(JNIEnv*, jclass) { pthread_t pthread; @@ -65,3 +66,18 @@ extern "C" JNIEXPORT void JNICALL Java_JniTest_testFindClassOnAttachedNativeThre int pthread_join_result = pthread_join(pthread, NULL); assert(pthread_join_result == 0); } + +// http://b/11243757 +extern "C" JNIEXPORT void JNICALL Java_JniTest_testCallStaticVoidMethodOnSubClassNative(JNIEnv* env, + jclass) { + jclass super_class = env->FindClass("JniTest$testCallStaticVoidMethodOnSubClass_SuperClass"); + assert(super_class != NULL); + + jmethodID execute = env->GetStaticMethodID(super_class, "execute", "()V"); + assert(execute != NULL); + + jclass sub_class = env->FindClass("JniTest$testCallStaticVoidMethodOnSubClass_SubClass"); + assert(sub_class != NULL); + + env->CallStaticVoidMethod(sub_class, execute); +} |