Harden -Xcheck:jni so we can log non-classes passed as jclasses.

Change-Id: I79dedf34daf74587ff4cb790898cd9955d2ab117
diff --git a/src/check_jni.cc b/src/check_jni.cc
index 423bc2f..2af35bb 100644
--- a/src/check_jni.cc
+++ b/src/check_jni.cc
@@ -95,6 +95,8 @@
 
 #define kFlag_Invocation    0x8000      /* Part of the invocation interface (JavaVM*) */
 
+#define kFlag_ForceTrace    0x80000000  // Add this to a JNI function's flags if you want to trace every call.
+
 static const char* gBuiltInPrefixes[] = {
   "Landroid/",
   "Lcom/android/",
@@ -392,7 +394,7 @@
       }
     }
 
-    if (traceMethod != NULL && ShouldTrace(vm_, traceMethod)) {
+    if (((flags_ & kFlag_ForceTrace) != 0) || (traceMethod != NULL && ShouldTrace(vm_, traceMethod))) {
       va_start(ap, fmt0);
       std::string msg;
       for (const char* fmt = fmt0; *fmt;) {
@@ -444,7 +446,9 @@
           if (c == NULL) {
             msg += "NULL";
           } else if (c == kInvalidIndirectRefObject || !Heap::IsHeapAddress(c)) {
-            StringAppendF(&msg, "%p(INVALID)", jc);
+            StringAppendF(&msg, "INVALID POINTER:%p", jc);
+          } else if (!c->IsClass()) {
+            msg += "INVALID NON-CLASS OBJECT OF TYPE:" + PrettyTypeOf(c);
           } else {
             msg += PrettyClass(c);
             if (!entry) {
@@ -509,7 +513,9 @@
       }
       va_end(ap);
 
-      if (entry) {
+      if ((flags_ & kFlag_ForceTrace) != 0) {
+        LOG(INFO) << "JNI: call to " << function_name_ << "(" << msg << ")";
+      } else if (entry) {
         if (has_method_) {
           std::string methodName(PrettyMethod(traceMethod, false));
           LOG(INFO) << "JNI: " << methodName << " -> " << function_name_ << "(" << msg << ")";
@@ -821,7 +827,7 @@
       okay = obj->GetClass()->IsStringClass();
       break;
     case kThrowable:
-      // TODO
+      okay = obj->GetClass()->IsThrowableClass();
       break;
     }
     if (!okay) {