diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk
index 790765b..b2313aa 100644
--- a/build/Android.gtest.mk
+++ b/build/Android.gtest.mk
@@ -62,8 +62,8 @@
 
   # Mac OS linker doesn't understand --export-dynamic.
   ifneq ($(HOST_OS)-$$(art_target_or_host),darwin-host)
-    # Allow jni_compiler_test to find Java_MyClass_bar within itself using dlopen(NULL, ...).
-    LOCAL_LDFLAGS := -Wl,--export-dynamic -Wl,-u,Java_MyClass_bar -Wl,-u,Java_MyClass_sbar
+    # Allow jni_compiler_test to find Java_MyClassNatives_bar within itself using dlopen(NULL, ...).
+    LOCAL_LDFLAGS := -Wl,--export-dynamic -Wl,-u,Java_MyClassNatives_bar -Wl,-u,Java_MyClassNatives_sbar
   endif
 
   LOCAL_CFLAGS := $(ART_TEST_CFLAGS)
diff --git a/src/check_jni.cc b/src/check_jni.cc
index 67b1c3e..1b28dd5 100644
--- a/src/check_jni.cc
+++ b/src/check_jni.cc
@@ -52,7 +52,7 @@
 
   JavaVMExt* vm = Runtime::Current()->GetJavaVM();
   if (vm->check_jni_abort_hook != NULL) {
-    vm->check_jni_abort_hook(os.str());
+    vm->check_jni_abort_hook(vm->check_jni_abort_hook_data, os.str());
   } else {
     self->SetState(Thread::kNative); // Ensure that we get a native stack trace for this thread.
     LOG(FATAL) << os.str();
diff --git a/src/common_test.h b/src/common_test.h
index 087168d..9f17e1d 100644
--- a/src/common_test.h
+++ b/src/common_test.h
@@ -528,6 +528,37 @@
   std::vector<const DexFile*> opened_dex_files_;
 };
 
+// Sets a CheckJni abort hook to catch failures. Note that this will cause CheckJNI to carry on
+// rather than aborting, so be careful!
+class CheckJniAbortCatcher {
+ public:
+  CheckJniAbortCatcher() : vm_(Runtime::Current()->GetJavaVM()) {
+    vm_->check_jni_abort_hook = Hook;
+    vm_->check_jni_abort_hook_data = &actual_;
+  }
+
+  ~CheckJniAbortCatcher() {
+    vm_->check_jni_abort_hook = NULL;
+    vm_->check_jni_abort_hook_data = NULL;
+  }
+
+  void Check(const char* expected_text) {
+    EXPECT_TRUE(actual_.find(expected_text) != std::string::npos) << "\n"
+        << "Expected to find: " << expected_text << "\n"
+        << "In the output   : " << actual_;
+  }
+
+ private:
+  static void Hook(void* data, const std::string& reason) {
+    *reinterpret_cast<std::string*>(data) = reason;
+  }
+
+  JavaVMExt* vm_;
+  std::string actual_;
+
+  DISALLOW_COPY_AND_ASSIGN(CheckJniAbortCatcher);
+};
+
 }  // namespace art
 
 namespace std {
diff --git a/src/jni_compiler_test.cc b/src/jni_compiler_test.cc
index a61bc9f..1757736 100644
--- a/src/jni_compiler_test.cc
+++ b/src/jni_compiler_test.cc
@@ -28,11 +28,11 @@
 #include "scoped_jni_thread_state.h"
 #include "thread.h"
 
-extern "C" JNIEXPORT jint JNICALL Java_MyClass_bar(JNIEnv*, jobject, jint count) {
+extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_bar(JNIEnv*, jobject, jint count) {
   return count + 1;
 }
 
-extern "C" JNIEXPORT jint JNICALL Java_MyClass_sbar(JNIEnv*, jclass, jint count) {
+extern "C" JNIEXPORT jint JNICALL Java_MyClassNatives_sbar(JNIEnv*, jclass, jint count) {
   return count + 1;
 }
 
@@ -44,7 +44,7 @@
   void CompileForTest(ClassLoader* class_loader, bool direct,
                       const char* method_name, const char* method_sig) {
     // Compile the native method before starting the runtime
-    Class* c = class_linker_->FindClass("LMyClass;", class_loader);
+    Class* c = class_linker_->FindClass("LMyClassNatives;", class_loader);
     Method* method;
     if (direct) {
       method = c->FindDirectMethod(method_name, method_sig);
@@ -59,7 +59,7 @@
     ASSERT_TRUE(method->GetCode() != NULL);
   }
 
-  void SetupForTest(ClassLoader* class_loader, bool direct,
+  void SetUpForTest(ClassLoader* class_loader, bool direct,
                     const char* method_name, const char* method_sig,
                     void* native_fnptr) {
     CompileForTest(class_loader, direct, method_name, method_sig);
@@ -69,7 +69,7 @@
 
     // JNI operations after runtime start
     env_ = Thread::Current()->GetJniEnv();
-    jklass_ = env_->FindClass("MyClass");
+    jklass_ = env_->FindClass("MyClassNatives");
     ASSERT_TRUE(jklass_ != NULL);
 
     if (direct) {
@@ -102,33 +102,33 @@
 jclass JniCompilerTest::jklass_;
 jobject JniCompilerTest::jobj_;
 
-int gJava_MyClass_foo_calls = 0;
-void Java_MyClass_foo(JNIEnv* env, jobject thisObj) {
+int gJava_MyClassNatives_foo_calls = 0;
+void Java_MyClassNatives_foo(JNIEnv* env, jobject thisObj) {
   // 2 = SirtRef<ClassLoader> + thisObj
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_foo_calls++;
+  gJava_MyClassNatives_foo_calls++;
 }
 
 TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "foo", "()V",
-               reinterpret_cast<void*>(&Java_MyClass_foo));
+  SetUpForTest(class_loader.get(), false, "foo", "()V",
+               reinterpret_cast<void*>(&Java_MyClassNatives_foo));
 
-  EXPECT_EQ(0, gJava_MyClass_foo_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_foo_calls);
   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
-  EXPECT_EQ(1, gJava_MyClass_foo_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
-  EXPECT_EQ(2, gJava_MyClass_foo_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
 }
 
 TEST_F(JniCompilerTest, CompileAndRunIntMethodThroughStub) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "bar", "(I)I",
-               NULL /* calling through stub will link with &Java_MyClass_bar */);
+  SetUpForTest(class_loader.get(), false, "bar", "(I)I",
+               NULL /* calling through stub will link with &Java_MyClassNatives_bar */);
 
   std::string reason;
   ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader.get(), reason))
@@ -140,8 +140,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunStaticIntMethodThroughStub) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "sbar", "(I)I",
-               NULL /* calling through stub will link with &Java_MyClass_sbar */);
+  SetUpForTest(class_loader.get(), true, "sbar", "(I)I",
+               NULL /* calling through stub will link with &Java_MyClassNatives_sbar */);
 
   std::string reason;
   ASSERT_TRUE(Runtime::Current()->GetJavaVM()->LoadNativeLibrary("", class_loader.get(), reason))
@@ -151,118 +151,118 @@
   EXPECT_EQ(43, result);
 }
 
-int gJava_MyClass_fooI_calls = 0;
-jint Java_MyClass_fooI(JNIEnv* env, jobject thisObj, jint x) {
+int gJava_MyClassNatives_fooI_calls = 0;
+jint Java_MyClassNatives_fooI(JNIEnv* env, jobject thisObj, jint x) {
   // 2 = SirtRef<ClassLoader> + thisObj
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_fooI_calls++;
+  gJava_MyClassNatives_fooI_calls++;
   return x;
 }
 
 TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooI", "(I)I",
-               reinterpret_cast<void*>(&Java_MyClass_fooI));
+  SetUpForTest(class_loader.get(), false, "fooI", "(I)I",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooI));
 
-  EXPECT_EQ(0, gJava_MyClass_fooI_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooI_calls);
   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 42);
   EXPECT_EQ(42, result);
-  EXPECT_EQ(1, gJava_MyClass_fooI_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooI_calls);
   result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFED00D);
   EXPECT_EQ(static_cast<jint>(0xCAFED00D), result);
-  EXPECT_EQ(2, gJava_MyClass_fooI_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooI_calls);
 }
 
-int gJava_MyClass_fooII_calls = 0;
-jint Java_MyClass_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
+int gJava_MyClassNatives_fooII_calls = 0;
+jint Java_MyClassNatives_fooII(JNIEnv* env, jobject thisObj, jint x, jint y) {
   // 2 = SirtRef<ClassLoader> + thisObj
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_fooII_calls++;
+  gJava_MyClassNatives_fooII_calls++;
   return x - y;  // non-commutative operator
 }
 
 TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooII", "(II)I",
-               reinterpret_cast<void*>(&Java_MyClass_fooII));
+  SetUpForTest(class_loader.get(), false, "fooII", "(II)I",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooII));
 
-  EXPECT_EQ(0, gJava_MyClass_fooII_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooII_calls);
   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 99, 10);
   EXPECT_EQ(99 - 10, result);
-  EXPECT_EQ(1, gJava_MyClass_fooII_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooII_calls);
   result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 0xCAFEBABE,
                                          0xCAFED00D);
   EXPECT_EQ(static_cast<jint>(0xCAFEBABE - 0xCAFED00D), result);
-  EXPECT_EQ(2, gJava_MyClass_fooII_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooII_calls);
 }
 
-int gJava_MyClass_fooJJ_calls = 0;
-jlong Java_MyClass_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
+int gJava_MyClassNatives_fooJJ_calls = 0;
+jlong Java_MyClassNatives_fooJJ(JNIEnv* env, jobject thisObj, jlong x, jlong y) {
   // 2 = SirtRef<ClassLoader> + thisObj
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_fooJJ_calls++;
+  gJava_MyClassNatives_fooJJ_calls++;
   return x - y;  // non-commutative operator
 }
 
 TEST_F(JniCompilerTest, CompileAndRunLongLongMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooJJ", "(JJ)J",
-               reinterpret_cast<void*>(&Java_MyClass_fooJJ));
+  SetUpForTest(class_loader.get(), false, "fooJJ", "(JJ)J",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooJJ));
 
-  EXPECT_EQ(0, gJava_MyClass_fooJJ_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooJJ_calls);
   jlong a = 0x1234567890ABCDEFll;
   jlong b = 0xFEDCBA0987654321ll;
   jlong result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, a, b);
   EXPECT_EQ(a - b, result);
-  EXPECT_EQ(1, gJava_MyClass_fooJJ_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooJJ_calls);
   result = env_->CallNonvirtualLongMethod(jobj_, jklass_, jmethod_, b, a);
   EXPECT_EQ(b - a, result);
-  EXPECT_EQ(2, gJava_MyClass_fooJJ_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooJJ_calls);
 }
 
-int gJava_MyClass_fooDD_calls = 0;
-jdouble Java_MyClass_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
+int gJava_MyClassNatives_fooDD_calls = 0;
+jdouble Java_MyClassNatives_fooDD(JNIEnv* env, jobject thisObj, jdouble x, jdouble y) {
   // 2 = SirtRef<ClassLoader> + thisObj
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_fooDD_calls++;
+  gJava_MyClassNatives_fooDD_calls++;
   return x - y;  // non-commutative operator
 }
 
 TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooDD", "(DD)D",
-               reinterpret_cast<void*>(&Java_MyClass_fooDD));
+  SetUpForTest(class_loader.get(), false, "fooDD", "(DD)D",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooDD));
 
-  EXPECT_EQ(0, gJava_MyClass_fooDD_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooDD_calls);
   jdouble result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_,
                                                     99.0, 10.0);
   EXPECT_EQ(99.0 - 10.0, result);
-  EXPECT_EQ(1, gJava_MyClass_fooDD_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooDD_calls);
   jdouble a = 3.14159265358979323846;
   jdouble b = 0.69314718055994530942;
   result = env_->CallNonvirtualDoubleMethod(jobj_, jklass_, jmethod_, a, b);
   EXPECT_EQ(a - b, result);
-  EXPECT_EQ(2, gJava_MyClass_fooDD_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooDD_calls);
 }
 
-int gJava_MyClass_fooIOO_calls = 0;
-jobject Java_MyClass_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
+int gJava_MyClassNatives_fooIOO_calls = 0;
+jobject Java_MyClassNatives_fooIOO(JNIEnv* env, jobject thisObj, jint x, jobject y,
                             jobject z) {
   // 4 = SirtRef<ClassLoader> + this + y + z
   EXPECT_EQ(4U, Thread::Current()->NumStackReferences());
@@ -270,7 +270,7 @@
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(thisObj != NULL);
   EXPECT_TRUE(env->IsInstanceOf(thisObj, JniCompilerTest::jklass_));
-  gJava_MyClass_fooIOO_calls++;
+  gJava_MyClassNatives_fooIOO_calls++;
   switch (x) {
     case 1:
       return y;
@@ -283,89 +283,89 @@
 
 TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooIOO",
+  SetUpForTest(class_loader.get(), false, "fooIOO",
                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
-               reinterpret_cast<void*>(&Java_MyClass_fooIOO));
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooIOO));
 
-  EXPECT_EQ(0, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooIOO_calls);
   jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, NULL);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(1, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooIOO_calls);
 
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, NULL, jklass_);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(2, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooIOO_calls);
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, NULL, jklass_);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(3, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(3, gJava_MyClassNatives_fooIOO_calls);
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, NULL, jklass_);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(4, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(4, gJava_MyClassNatives_fooIOO_calls);
 
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 0, jklass_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(5, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(5, gJava_MyClassNatives_fooIOO_calls);
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 1, jklass_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(6, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(6, gJava_MyClassNatives_fooIOO_calls);
   result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, 2, jklass_, NULL);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(7, gJava_MyClass_fooIOO_calls);
+  EXPECT_EQ(7, gJava_MyClassNatives_fooIOO_calls);
 }
 
-int gJava_MyClass_fooSII_calls = 0;
-jint Java_MyClass_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
+int gJava_MyClassNatives_fooSII_calls = 0;
+jint Java_MyClassNatives_fooSII(JNIEnv* env, jclass klass, jint x, jint y) {
   // 2 = SirtRef<ClassLoader> + klass
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(klass != NULL);
   EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
-  gJava_MyClass_fooSII_calls++;
+  gJava_MyClassNatives_fooSII_calls++;
   return x + y;
 }
 
 TEST_F(JniCompilerTest, CompileAndRunStaticIntIntMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "fooSII", "(II)I",
-               reinterpret_cast<void*>(&Java_MyClass_fooSII));
+  SetUpForTest(class_loader.get(), true, "fooSII", "(II)I",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooSII));
 
-  EXPECT_EQ(0, gJava_MyClass_fooSII_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooSII_calls);
   jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 20, 30);
   EXPECT_EQ(50, result);
-  EXPECT_EQ(1, gJava_MyClass_fooSII_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooSII_calls);
 }
 
-int gJava_MyClass_fooSDD_calls = 0;
-jdouble Java_MyClass_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
+int gJava_MyClassNatives_fooSDD_calls = 0;
+jdouble Java_MyClassNatives_fooSDD(JNIEnv* env, jclass klass, jdouble x, jdouble y) {
   // 2 = SirtRef<ClassLoader> + klass
   EXPECT_EQ(2U, Thread::Current()->NumStackReferences());
   EXPECT_EQ(Thread::kNative, Thread::Current()->GetState());
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(klass != NULL);
   EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
-  gJava_MyClass_fooSDD_calls++;
+  gJava_MyClassNatives_fooSDD_calls++;
   return x - y;  // non-commutative operator
 }
 
 TEST_F(JniCompilerTest, CompileAndRunStaticDoubleDoubleMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "fooSDD", "(DD)D",
-               reinterpret_cast<void*>(&Java_MyClass_fooSDD));
+  SetUpForTest(class_loader.get(), true, "fooSDD", "(DD)D",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooSDD));
 
-  EXPECT_EQ(0, gJava_MyClass_fooSDD_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooSDD_calls);
   jdouble result = env_->CallStaticDoubleMethod(jklass_, jmethod_, 99.0, 10.0);
   EXPECT_EQ(99.0 - 10.0, result);
-  EXPECT_EQ(1, gJava_MyClass_fooSDD_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooSDD_calls);
   jdouble a = 3.14159265358979323846;
   jdouble b = 0.69314718055994530942;
   result = env_->CallStaticDoubleMethod(jklass_, jmethod_, a, b);
   EXPECT_EQ(a - b, result);
-  EXPECT_EQ(2, gJava_MyClass_fooSDD_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooSDD_calls);
 }
 
-int gJava_MyClass_fooSIOO_calls = 0;
-jobject Java_MyClass_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
+int gJava_MyClassNatives_fooSIOO_calls = 0;
+jobject Java_MyClassNatives_fooSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
                              jobject z) {
   // 4 = SirtRef<ClassLoader> + klass + y + z
   EXPECT_EQ(4U, Thread::Current()->NumStackReferences());
@@ -373,7 +373,7 @@
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(klass != NULL);
   EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
-  gJava_MyClass_fooSIOO_calls++;
+  gJava_MyClassNatives_fooSIOO_calls++;
   switch (x) {
     case 1:
       return y;
@@ -387,38 +387,38 @@
 
 TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "fooSIOO",
+  SetUpForTest(class_loader.get(), true, "fooSIOO",
                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
-               reinterpret_cast<void*>(&Java_MyClass_fooSIOO));
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooSIOO));
 
-  EXPECT_EQ(0, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooSIOO_calls);
   jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(1, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooSIOO_calls);
 
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(2, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(3, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(3, gJava_MyClassNatives_fooSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(4, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(4, gJava_MyClassNatives_fooSIOO_calls);
 
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(5, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(5, gJava_MyClassNatives_fooSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(6, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(6, gJava_MyClassNatives_fooSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(7, gJava_MyClass_fooSIOO_calls);
+  EXPECT_EQ(7, gJava_MyClassNatives_fooSIOO_calls);
 }
 
-int gJava_MyClass_fooSSIOO_calls = 0;
-jobject Java_MyClass_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
+int gJava_MyClassNatives_fooSSIOO_calls = 0;
+jobject Java_MyClassNatives_fooSSIOO(JNIEnv* env, jclass klass, jint x, jobject y,
                              jobject z) {
   // 4 = SirtRef<ClassLoader> + klass + y + z
   EXPECT_EQ(4U, Thread::Current()->NumStackReferences());
@@ -426,7 +426,7 @@
   EXPECT_EQ(Thread::Current()->GetJniEnv(), env);
   EXPECT_TRUE(klass != NULL);
   EXPECT_TRUE(env->IsInstanceOf(JniCompilerTest::jobj_, klass));
-  gJava_MyClass_fooSSIOO_calls++;
+  gJava_MyClassNatives_fooSSIOO_calls++;
   switch (x) {
     case 1:
       return y;
@@ -439,37 +439,37 @@
 
 TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "fooSSIOO",
+  SetUpForTest(class_loader.get(), true, "fooSSIOO",
                "(ILjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
-               reinterpret_cast<void*>(&Java_MyClass_fooSSIOO));
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooSSIOO));
 
-  EXPECT_EQ(0, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(0, gJava_MyClassNatives_fooSSIOO_calls);
   jobject result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, NULL);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(1, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_fooSSIOO_calls);
 
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(2, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_fooSSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(3, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(3, gJava_MyClassNatives_fooSSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, NULL, jobj_);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(4, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(4, gJava_MyClassNatives_fooSSIOO_calls);
 
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 0, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jklass_, result));
-  EXPECT_EQ(5, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(5, gJava_MyClassNatives_fooSSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 1, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(jobj_, result));
-  EXPECT_EQ(6, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(6, gJava_MyClassNatives_fooSSIOO_calls);
   result = env_->CallStaticObjectMethod(jklass_, jmethod_, 2, jobj_, NULL);
   EXPECT_TRUE(env_->IsSameObject(NULL, result));
-  EXPECT_EQ(7, gJava_MyClass_fooSSIOO_calls);
+  EXPECT_EQ(7, gJava_MyClassNatives_fooSSIOO_calls);
 }
 
-void Java_MyClass_throwException(JNIEnv* env, jobject) {
+void Java_MyClassNatives_throwException(JNIEnv* env, jobject) {
   jclass c = env->FindClass("java/lang/RuntimeException");
   env->ThrowNew(c, "hello");
 }
@@ -477,37 +477,37 @@
 TEST_F(JniCompilerTest, ExceptionHandling) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
 
-  // all compilation needs to happen before SetupForTest calls Runtime::Start
+  // all compilation needs to happen before SetUpForTest calls Runtime::Start
   CompileForTest(class_loader.get(), false, "foo", "()V");
   CompileForTest(class_loader.get(), false, "throwException", "()V");
   CompileForTest(class_loader.get(), false, "foo", "()V");
 
-  gJava_MyClass_foo_calls = 0;
+  gJava_MyClassNatives_foo_calls = 0;
 
   // Check a single call of a JNI method is ok
-  SetupForTest(class_loader.get(), false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClass_foo));
+  SetUpForTest(class_loader.get(), false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
-  EXPECT_EQ(1, gJava_MyClass_foo_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
   EXPECT_FALSE(Thread::Current()->IsExceptionPending());
 
   // Get class for exception we expect to be thrown
   Class* jlre = class_linker_->FindClass("Ljava/lang/RuntimeException;", class_loader.get());
-  SetupForTest(class_loader.get(), false, "throwException", "()V",
-               reinterpret_cast<void*>(&Java_MyClass_throwException));
-  // Call Java_MyClass_throwException (JNI method that throws exception)
+  SetUpForTest(class_loader.get(), false, "throwException", "()V",
+               reinterpret_cast<void*>(&Java_MyClassNatives_throwException));
+  // Call Java_MyClassNatives_throwException (JNI method that throws exception)
   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
-  EXPECT_EQ(1, gJava_MyClass_foo_calls);
+  EXPECT_EQ(1, gJava_MyClassNatives_foo_calls);
   EXPECT_TRUE(Thread::Current()->IsExceptionPending());
   EXPECT_TRUE(Thread::Current()->GetException()->InstanceOf(jlre));
   Thread::Current()->ClearException();
 
   // Check a single call of a JNI method is ok
-  SetupForTest(class_loader.get(), false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClass_foo));
+  SetUpForTest(class_loader.get(), false, "foo", "()V", reinterpret_cast<void*>(&Java_MyClassNatives_foo));
   env_->CallNonvirtualVoidMethod(jobj_, jklass_, jmethod_);
-  EXPECT_EQ(2, gJava_MyClass_foo_calls);
+  EXPECT_EQ(2, gJava_MyClassNatives_foo_calls);
 }
 
-jint Java_MyClass_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
+jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
   if (i <= 0) {
     // We want to check raw Object*/Array* below
     ScopedJniThreadState ts(env);
@@ -525,14 +525,14 @@
       EXPECT_EQ(-2, trace_array->Get(i)->GetLineNumber());
       StackTraceElement* ste = trace_array->Get(i);
       EXPECT_STREQ("MyClassNatives.java", ste->GetFileName()->ToModifiedUtf8().c_str());
-      EXPECT_STREQ("MyClass", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
+      EXPECT_STREQ("MyClassNatives", ste->GetDeclaringClass()->ToModifiedUtf8().c_str());
       EXPECT_STREQ("fooI", ste->GetMethodName()->ToModifiedUtf8().c_str());
     }
 
     // end recursion
     return 0;
   } else {
-    jclass jklass = env->FindClass("MyClass");
+    jclass jklass = env->FindClass("MyClassNatives");
     EXPECT_TRUE(jklass != NULL);
     jmethodID jmethod = env->GetMethodID(jklass, "fooI", "(I)I");
     EXPECT_TRUE(jmethod != NULL);
@@ -547,20 +547,20 @@
 
 TEST_F(JniCompilerTest, NativeStackTraceElement) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooI", "(I)I",
-               reinterpret_cast<void*>(&Java_MyClass_nativeUpCall));
+  SetUpForTest(class_loader.get(), false, "fooI", "(I)I",
+               reinterpret_cast<void*>(&Java_MyClassNatives_nativeUpCall));
   jint result = env_->CallNonvirtualIntMethod(jobj_, jklass_, jmethod_, 10);
   EXPECT_EQ(10+9+8+7+6+5+4+3+2+1, result);
 }
 
-jobject Java_MyClass_fooO(JNIEnv* env, jobject, jobject x) {
+jobject Java_MyClassNatives_fooO(JNIEnv* env, jobject, jobject x) {
   return env->NewGlobalRef(x);
 }
 
 TEST_F(JniCompilerTest, ReturnGlobalRef) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
-               reinterpret_cast<void*>(&Java_MyClass_fooO));
+  SetUpForTest(class_loader.get(), false, "fooO", "(Ljava/lang/Object;)Ljava/lang/Object;",
+               reinterpret_cast<void*>(&Java_MyClassNatives_fooO));
   jobject result = env_->CallNonvirtualObjectMethod(jobj_, jklass_, jmethod_, jobj_);
   EXPECT_EQ(JNILocalRefType, env_->GetObjectRefType(result));
   EXPECT_TRUE(env_->IsSameObject(result, jobj_));
@@ -576,7 +576,7 @@
 
 TEST_F(JniCompilerTest, LocalReferenceTableClearingTest) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
+  SetUpForTest(class_loader.get(), false, "fooI", "(I)I", reinterpret_cast<void*>(&local_ref_test));
   // 1000 invocations of a method that adds 10 local references
   for (int i = 0; i < 1000; i++) {
     jint result = env_->CallIntMethod(jobj_, jmethod_, i);
@@ -595,7 +595,7 @@
 
 TEST_F(JniCompilerTest, JavaLangSystemArrayCopy) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
+  SetUpForTest(class_loader.get(), true, "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V",
                reinterpret_cast<void*>(&my_arraycopy));
   env_->CallStaticVoidMethod(jklass_, jmethod_, jobj_, 1234, jklass_, 5678, 9876);
 }
@@ -611,7 +611,7 @@
 
 TEST_F(JniCompilerTest, CompareAndSwapInt) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
+  SetUpForTest(class_loader.get(), false, "compareAndSwapInt", "(Ljava/lang/Object;JII)Z",
                reinterpret_cast<void*>(&my_casi));
   jboolean result = env_->CallBooleanMethod(jobj_, jmethod_, jobj_, 0x12345678ABCDEF88ll, 0xCAFEF00D, 0xEBADF00D);
   EXPECT_EQ(result, JNI_TRUE);
@@ -628,11 +628,83 @@
 
 TEST_F(JniCompilerTest, GetText) {
   SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
-  SetupForTest(class_loader.get(), true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
+  SetUpForTest(class_loader.get(), true, "getText", "(JLjava/lang/Object;JLjava/lang/Object;)I",
                reinterpret_cast<void*>(&my_gettext));
   jint result = env_->CallStaticIntMethod(jklass_, jmethod_, 0x12345678ABCDEF88ll, jobj_,
                                           0x7FEDCBA987654321ll, jobj_);
   EXPECT_EQ(result, 42);
 }
 
+// This should return jclass, but we're imitating a bug pattern.
+jobject Java_MyClassNatives_instanceMethodThatShouldReturnClass(JNIEnv* env, jobject) {
+  return env->NewStringUTF("not a class!");
+}
+
+// This should return jclass, but we're imitating a bug pattern.
+jobject Java_MyClassNatives_staticMethodThatShouldReturnClass(JNIEnv* env, jclass) {
+  return env->NewStringUTF("not a class!");
+}
+
+TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Instance) {
+  SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
+  SetUpForTest(class_loader.get(), false, "instanceMethodThatShouldReturnClass", "()Ljava/lang/Class;",
+               reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldReturnClass));
+
+  CheckJniAbortCatcher check_jni_abort_catcher;
+
+  // This native method is bad, and tries to return a jstring as a jclass.
+  env_->CallObjectMethod(jobj_, jmethod_);
+  check_jni_abort_catcher.Check("java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass");
+
+  // Here, we just call the method wrong; we should catch that too.
+  env_->CallVoidMethod(jobj_, jmethod_);
+  check_jni_abort_catcher.Check("java.lang.Class MyClassNatives.instanceMethodThatShouldReturnClass");
+}
+
+TEST_F(JniCompilerTest, UpcallReturnTypeChecking_Static) {
+  SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
+  SetUpForTest(class_loader.get(), true, "staticMethodThatShouldReturnClass", "()Ljava/lang/Class;",
+               reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldReturnClass));
+
+  CheckJniAbortCatcher check_jni_abort_catcher;
+
+  // This native method is bad, and tries to return a jstring as a jclass.
+  env_->CallStaticObjectMethod(jklass_, jmethod_);
+  check_jni_abort_catcher.Check("java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass");
+
+  // Here, we just call the method wrong; we should catch that too.
+  env_->CallVoidMethod(jobj_, jmethod_);
+  check_jni_abort_catcher.Check("java.lang.Class MyClassNatives.staticMethodThatShouldReturnClass");
+}
+
+// This should take jclass, but we're imitating a bug pattern.
+void Java_MyClassNatives_instanceMethodThatShouldTakeClass(JNIEnv*, jobject, jclass) {
+}
+
+// This should take jclass, but we're imitating a bug pattern.
+void Java_MyClassNatives_staticMethodThatShouldTakeClass(JNIEnv*, jclass, jclass) {
+}
+
+TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Instance) {
+  SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
+  SetUpForTest(class_loader.get(), false, "instanceMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
+               reinterpret_cast<void*>(&Java_MyClassNatives_instanceMethodThatShouldTakeClass));
+
+  CheckJniAbortCatcher check_jni_abort_catcher;
+  // We deliberately pass a bad second argument here.
+  env_->CallVoidMethod(jobj_, jmethod_, 123, env_->NewStringUTF("not a class!"));
+  check_jni_abort_catcher.Check("Aborting because JNI app bug detected");
+}
+
+TEST_F(JniCompilerTest, UpcallArgumentTypeChecking_Static) {
+  SirtRef<ClassLoader> class_loader(LoadDex("MyClassNatives"));
+  SetUpForTest(class_loader.get(), true, "staticMethodThatShouldTakeClass", "(ILjava/lang/Class;)V",
+               reinterpret_cast<void*>(&Java_MyClassNatives_staticMethodThatShouldTakeClass));
+
+  CheckJniAbortCatcher check_jni_abort_catcher;
+  // We deliberately pass a bad second argument here.
+  env_->CallStaticVoidMethod(jklass_, jmethod_, 123, env_->NewStringUTF("not a class!"));
+  check_jni_abort_catcher.Check("Aborting because JNI app bug detected");
+}
+
 }  // namespace art
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index c5c7c8c..133cc1e 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -262,7 +262,36 @@
   return reinterpret_cast<T>(ts.Self()->DecodeJObject(obj));
 }
 
+// TODO: can we make this available in non-debug builds if CheckJNI is on, or is it too expensive?
+#if !defined(NDEBUG)
+static void CheckMethodArguments(Method* m, JValue* args) {
+  MethodHelper mh(m);
+  ObjectArray<Class>* parameter_types = mh.GetParameterTypes();
+  CHECK(parameter_types != NULL);
+  size_t error_count = 0;
+  for (int i = 0; i < parameter_types->GetLength(); ++i) {
+    Class* parameter_type = parameter_types->Get(i);
+    if (!parameter_type->IsPrimitive()) {
+      Object* argument = args[i].l;
+      if (argument != NULL && !argument->InstanceOf(parameter_type)) {
+        LOG(ERROR) << "JNI ERROR (app bug): attempt to pass an instance of "
+                   << PrettyTypeOf(argument) << " as argument " << (i + 1) << " to " << PrettyMethod(m);
+        ++error_count;
+      }
+    }
+  }
+  if (error_count > 0) {
+    // TODO: pass the JNI function name (such as "CallVoidMethodV") through so we can call JniAbort
+    // with an argument.
+    JniAbort(NULL);
+  }
+}
+#else
+static void CheckMethodArguments(Method*, JValue*) { }
+#endif
+
 static JValue InvokeWithArgArray(JNIEnv* public_env, Object* receiver, Method* method, JValue* args) {
+  CheckMethodArguments(method, args);
   JNIEnvExt* env = reinterpret_cast<JNIEnvExt*>(public_env);
   JValue result = { 0 };
   method->Invoke(env->self, receiver, args, &result);
@@ -2711,6 +2740,7 @@
 JavaVMExt::JavaVMExt(Runtime* runtime, Runtime::ParsedOptions* options)
     : runtime(runtime),
       check_jni_abort_hook(NULL),
+      check_jni_abort_hook_data(NULL),
       check_jni(false),
       force_copy(false), // TODO: add a way to enable this
       trace(options->jni_trace_),
diff --git a/src/jni_internal.h b/src/jni_internal.h
index 021559f..312b754 100644
--- a/src/jni_internal.h
+++ b/src/jni_internal.h
@@ -106,7 +106,8 @@
   Runtime* runtime;
 
   // Used for testing. By default, we'll LOG(FATAL) the reason.
-  void (*check_jni_abort_hook)(const std::string& reason);
+  void (*check_jni_abort_hook)(void* data, const std::string& reason);
+  void* check_jni_abort_hook_data;
 
   // Extra checking.
   bool check_jni;
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 8bdc8c6..8f7884d 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -41,6 +41,10 @@
     CHECK(aioobe.get() != NULL);
     aioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(aioobe.get()));
 
+    ScopedLocalRef<jclass> ase(env_, env_->FindClass("java/lang/ArrayStoreException"));
+    CHECK(ase.get() != NULL);
+    ase_ = reinterpret_cast<jclass>(env_->NewGlobalRef(ase.get()));
+
     ScopedLocalRef<jclass> sioobe(env_, env_->FindClass("java/lang/StringIndexOutOfBoundsException"));
     CHECK(sioobe.get() != NULL);
     sioobe_ = reinterpret_cast<jclass>(env_->NewGlobalRef(sioobe.get()));
@@ -48,6 +52,7 @@
 
   virtual void TearDown() {
     env_->DeleteGlobalRef(aioobe_);
+    env_->DeleteGlobalRef(ase_);
     env_->DeleteGlobalRef(sioobe_);
     CommonTest::TearDown();
   }
@@ -494,6 +499,7 @@
   JavaVMExt* vm_;
   JNIEnvExt* env_;
   jclass aioobe_;
+  jclass ase_;
   jclass sioobe_;
 };
 
@@ -525,35 +531,33 @@
   EXPECT_TRUE(env_->ExceptionCheck()); \
   env_->ExceptionClear()
 
-std::string gCheckJniAbortMessage;
-void TestCheckJniAbortHook(const std::string& reason) {
-  gCheckJniAbortMessage = reason;
-}
-
 TEST_F(JniInternalTest, FindClass) {
   // Reference types...
   EXPECT_CLASS_FOUND("java/lang/String");
   // ...for arrays too, where you must include "L;".
   EXPECT_CLASS_FOUND("[Ljava/lang/String;");
 
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  // We support . as well as / for compatibility, if -Xcheck:jni is off.
-  EXPECT_CLASS_FOUND("java.lang.String");
-  EXPECT_CLASS_NOT_FOUND("Ljava.lang.String;");
-  EXPECT_CLASS_FOUND("[Ljava.lang.String;");
-  EXPECT_CLASS_NOT_FOUND("[java.lang.String");
+  {
+    CheckJniAbortCatcher check_jni_abort_catcher;
 
-  // You can't include the "L;" in a JNI class descriptor.
-  EXPECT_CLASS_NOT_FOUND("Ljava/lang/String;");
-  // But you must include it for an array of any reference type.
-  EXPECT_CLASS_NOT_FOUND("[java/lang/String");
-  vm_->check_jni_abort_hook = NULL;
+    // We support . as well as / for compatibility, if -Xcheck:jni is off.
+    EXPECT_CLASS_FOUND("java.lang.String");
+    EXPECT_CLASS_NOT_FOUND("Ljava.lang.String;");
+    EXPECT_CLASS_FOUND("[Ljava.lang.String;");
+    EXPECT_CLASS_NOT_FOUND("[java.lang.String");
+
+    // You can't include the "L;" in a JNI class descriptor.
+    EXPECT_CLASS_NOT_FOUND("Ljava/lang/String;");
+    // But you must include it for an array of any reference type.
+    EXPECT_CLASS_NOT_FOUND("[java/lang/String");
+  }
 
   // Primitive arrays are okay (if the primitive type is valid)...
   EXPECT_CLASS_FOUND("[C");
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  EXPECT_CLASS_NOT_FOUND("[K");
-  vm_->check_jni_abort_hook = NULL;
+  {
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    EXPECT_CLASS_NOT_FOUND("[K");
+  }
   // But primitive types aren't allowed...
   EXPECT_CLASS_NOT_FOUND("C");
   EXPECT_CLASS_NOT_FOUND("K");
@@ -1007,10 +1011,11 @@
 }
 
 TEST_F(JniInternalTest, GetStringUTFChars_ReleaseStringUTFChars) {
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni.
-  EXPECT_TRUE(env_->GetStringUTFChars(NULL, NULL) == NULL);
-  vm_->check_jni_abort_hook = NULL;
+  {
+    // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni.
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    EXPECT_TRUE(env_->GetStringUTFChars(NULL, NULL) == NULL);
+  }
 
   jstring s = env_->NewStringUTF("hello");
   ASSERT_TRUE(s != NULL);
@@ -1075,24 +1080,26 @@
 }
 
 TEST_F(JniInternalTest, GetObjectArrayElement_SetObjectArrayElement) {
-  jclass c = env_->FindClass("java/lang/Object");
-  ASSERT_TRUE(c != NULL);
+  jclass java_lang_Class = env_->FindClass("java/lang/Class");
+  ASSERT_TRUE(java_lang_Class != NULL);
 
-  jobjectArray array = env_->NewObjectArray(1, c, NULL);
+  jobjectArray array = env_->NewObjectArray(1, java_lang_Class, NULL);
   EXPECT_TRUE(array != NULL);
   EXPECT_TRUE(env_->GetObjectArrayElement(array, 0) == NULL);
-  env_->SetObjectArrayElement(array, 0, c);
-  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(array, 0), c));
+  env_->SetObjectArrayElement(array, 0, java_lang_Class);
+  EXPECT_TRUE(env_->IsSameObject(env_->GetObjectArrayElement(array, 0), java_lang_Class));
 
   // ArrayIndexOutOfBounds for negative index.
-  env_->SetObjectArrayElement(array, -1, c);
+  env_->SetObjectArrayElement(array, -1, java_lang_Class);
   EXPECT_EXCEPTION(aioobe_);
 
   // ArrayIndexOutOfBounds for too-large index.
-  env_->SetObjectArrayElement(array, 1, c);
+  env_->SetObjectArrayElement(array, 1, java_lang_Class);
   EXPECT_EXCEPTION(aioobe_);
 
-  // TODO: check ArrayStoreException thrown for bad types.
+  // ArrayStoreException thrown for bad types.
+  env_->SetObjectArrayElement(array, 0, env_->NewStringUTF("not a jclass!"));
+  EXPECT_EXCEPTION(ase_);
 }
 
 #define EXPECT_STATIC_PRIMITIVE_FIELD(type, field_name, sig, value1, value2) \
@@ -1199,10 +1206,11 @@
   ASSERT_TRUE(s != NULL);
   env_->DeleteLocalRef(s);
 
-  // Currently, deleting an already-deleted reference is just a warning.
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  env_->DeleteLocalRef(s);
-  vm_->check_jni_abort_hook = NULL;
+  {
+    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    env_->DeleteLocalRef(s);
+  }
 
   s = env_->NewStringUTF("");
   ASSERT_TRUE(s != NULL);
@@ -1276,10 +1284,11 @@
   ASSERT_TRUE(o != NULL);
   env_->DeleteGlobalRef(o);
 
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  // Currently, deleting an already-deleted reference is just a warning.
-  env_->DeleteGlobalRef(o);
-  vm_->check_jni_abort_hook = NULL;
+  {
+    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    env_->DeleteGlobalRef(o);
+  }
 
   jobject o1 = env_->NewGlobalRef(s);
   ASSERT_TRUE(o1 != NULL);
@@ -1316,10 +1325,11 @@
   ASSERT_TRUE(o != NULL);
   env_->DeleteWeakGlobalRef(o);
 
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  // Currently, deleting an already-deleted reference is just a warning.
-  env_->DeleteWeakGlobalRef(o);
-  vm_->check_jni_abort_hook = NULL;
+  {
+    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    env_->DeleteWeakGlobalRef(o);
+  }
 
   jobject o1 = env_->NewWeakGlobalRef(s);
   ASSERT_TRUE(o1 != NULL);
@@ -1540,12 +1550,17 @@
   EXPECT_TRUE(env_->IsInstanceOf(thrown_exception, imse_class));
 
   // It's an error to call MonitorEnter or MonitorExit on NULL.
-  vm_->check_jni_abort_hook = TestCheckJniAbortHook;
-  env_->MonitorEnter(NULL);
-  EXPECT_TRUE(gCheckJniAbortMessage.find("in call to MonitorEnter") != std::string::npos);
-  env_->MonitorExit(NULL);
-  EXPECT_TRUE(gCheckJniAbortMessage.find("in call to MonitorExit") != std::string::npos);
-  vm_->check_jni_abort_hook = NULL;
+  {
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    env_->MonitorEnter(NULL);
+    check_jni_abort_catcher.Check("in call to MonitorEnter");
+  }
+
+  {
+    CheckJniAbortCatcher check_jni_abort_catcher;
+    env_->MonitorExit(NULL);
+    check_jni_abort_catcher.Check("in call to MonitorExit");
+  }
 }
 
 }  // namespace art
diff --git a/src/oat/runtime/support_jni.cc b/src/oat/runtime/support_jni.cc
index 7324cf4..e6e6478 100644
--- a/src/oat/runtime/support_jni.cc
+++ b/src/oat/runtime/support_jni.cc
@@ -41,11 +41,34 @@
 }
 
 // Return value helper for jobject return types, used for JNI return values.
-extern Object* DecodeJObjectInThread(Thread* thread, jobject obj) {
-  if (thread->IsExceptionPending()) {
+extern Object* DecodeJObjectInThread(Thread* self, jobject java_object) {
+  if (self->IsExceptionPending()) {
     return NULL;
   }
-  return thread->DecodeJObject(obj);
+  Object* o = self->DecodeJObject(java_object);
+  if (o == NULL || !self->GetJniEnv()->check_jni) {
+    return o;
+  }
+
+  if (o == kInvalidIndirectRefObject) {
+    LOG(ERROR) << "JNI ERROR (app bug): invalid reference returned from "
+               << PrettyMethod(self->GetCurrentMethod());
+    JniAbort(NULL);
+  }
+
+  // Make sure that the result is an instance of the type this
+  // method was expected to return.
+  Method* m = self->GetCurrentMethod();
+  MethodHelper mh(m);
+  Class* return_type = mh.GetReturnType();
+
+  if (!o->InstanceOf(return_type)) {
+    LOG(ERROR) << "JNI ERROR (app bug): attempt to return an instance of " << PrettyTypeOf(o)
+               << " from " << PrettyMethod(m);
+    JniAbort(NULL);
+  }
+
+  return o;
 }
 
 static void WorkAroundJniBugsForJobject(intptr_t* arg_ptr) {
diff --git a/src/scoped_jni_thread_state.h b/src/scoped_jni_thread_state.h
index 552f5ed..1065a96 100644
--- a/src/scoped_jni_thread_state.h
+++ b/src/scoped_jni_thread_state.h
@@ -51,12 +51,13 @@
  private:
   static Thread* ThreadForEnv(JNIEnv* env) {
     JNIEnvExt* full_env(reinterpret_cast<JNIEnvExt*>(env));
+    bool work_around_app_jni_bugs = full_env->vm->work_around_app_jni_bugs;
     Thread* env_self = full_env->self;
-    Thread* self = full_env->vm->work_around_app_jni_bugs ? Thread::Current() : env_self;
-    if (self != env_self) {
-      LOG(ERROR) << "JNI ERROR: JNIEnv for " << *env_self
+    Thread* self = work_around_app_jni_bugs ? Thread::Current() : env_self;
+    if (!work_around_app_jni_bugs && self != env_self) {
+      LOG(FATAL) << "JNI ERROR (app bug): JNIEnv for " << *env_self
                  << " used on " << *self;
-      // TODO: dump stack
+      // TODO: pass JNI function through so we can call JniAbort(function_name) instead.
     }
     return self;
   }
diff --git a/test/MyClassNatives/MyClassNatives.java b/test/MyClassNatives/MyClassNatives.java
index 4987373..9a03999 100644
--- a/test/MyClassNatives/MyClassNatives.java
+++ b/test/MyClassNatives/MyClassNatives.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-class MyClass {
+class MyClassNatives {
     native void throwException();
     native void foo();
     native int bar(int count);
@@ -32,4 +32,10 @@
     static native void arraycopy(Object src, int src_pos, Object dst, int dst_pos, int length);
     native boolean compareAndSwapInt(Object obj, long offset, int expected, int newval);
     static native int getText(long val1, Object obj1, long val2, Object obj2);
-}
+
+    native Class instanceMethodThatShouldReturnClass();
+    static native Class staticMethodThatShouldReturnClass();
+
+    native void instanceMethodThatShouldTakeClass(int i, Class c);
+    static native void staticMethodThatShouldTakeClass(int i, Class c);
+  }
