diff options
-rw-r--r-- | runtime/indirect_reference_table.cc | 5 | ||||
-rw-r--r-- | test/004-JniTest/jni_test.cc | 5 | ||||
-rw-r--r-- | test/004-JniTest/src/Main.java | 7 |
3 files changed, 16 insertions, 1 deletions
diff --git a/runtime/indirect_reference_table.cc b/runtime/indirect_reference_table.cc index 0ef58ea067..55632bad55 100644 --- a/runtime/indirect_reference_table.cc +++ b/runtime/indirect_reference_table.cc @@ -17,6 +17,7 @@ #include "indirect_reference_table-inl.h" #include "jni_internal.h" +#include "nth_caller_visitor.h" #include "reference_table.h" #include "runtime.h" #include "scoped_thread_state_change.h" @@ -181,7 +182,9 @@ bool IndirectReferenceTable::Remove(uint32_t cookie, IndirectRef iref) { auto* env = self->GetJniEnv(); DCHECK(env != nullptr); if (env->check_jni) { - LOG(WARNING) << "Attempt to remove local handle scope entry from IRT, ignoring"; + ScopedObjectAccess soa(self); + LOG(WARNING) << "Attempt to remove non-JNI local reference, dumping thread"; + self->Dump(LOG(WARNING)); } return true; } diff --git a/test/004-JniTest/jni_test.cc b/test/004-JniTest/jni_test.cc index 71a2b2dddc..ca256ec034 100644 --- a/test/004-JniTest/jni_test.cc +++ b/test/004-JniTest/jni_test.cc @@ -258,6 +258,11 @@ extern "C" jchar JNICALL Java_Main_charMethod(JNIEnv*, jclass, jchar c1, jchar c return char_returns[c1]; } +extern "C" JNIEXPORT void JNICALL Java_Main_removeLocalObject(JNIEnv* env, jclass, jclass o) { + // Delete the arg to see if it crashes. + env->DeleteLocalRef(o); +} + extern "C" JNIEXPORT jboolean JNICALL Java_Main_nativeIsAssignableFrom(JNIEnv* env, jclass, jclass from, jclass to) { return env->IsAssignableFrom(from, to); diff --git a/test/004-JniTest/src/Main.java b/test/004-JniTest/src/Main.java index 584fae3a57..a81ec6d748 100644 --- a/test/004-JniTest/src/Main.java +++ b/test/004-JniTest/src/Main.java @@ -34,6 +34,7 @@ public class Main { testShallowGetStackClass2(); testCallNonvirtual(); testNewStringObject(); + testRemoveLocalObject(); } private static native void testFindClassOnAttachedNativeThread(); @@ -111,6 +112,12 @@ public class Main { } } + private static native void removeLocalObject(Object o); + + private static void testRemoveLocalObject() { + removeLocalObject(new Object()); + } + private static native short shortMethod(short s1, short s2, short s3, short s4, short s5, short s6, short s7, short s8, short s9, short s10); |