summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/indirect_reference_table.cc5
-rw-r--r--test/004-JniTest/jni_test.cc5
-rw-r--r--test/004-JniTest/src/Main.java7
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);