Actually track the JNI MonitorEnter/MonitorExit calls.

Also log if we do end up having to clean up behind a detaching thread.

Also add a few missing "static"s.

Change-Id: I4ba1734b04b9a6dde112f3693a6dd171b42cd69c
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 00667ad..dba933a 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -2224,14 +2224,24 @@
 
   static jint MonitorEnter(JNIEnv* env, jobject java_object) {
     ScopedJniThreadState ts(env);
-    Decode<Object*>(ts, java_object)->MonitorEnter(ts.Self());
-    return ts.Self()->IsExceptionPending() ? JNI_ERR : JNI_OK;
+    Object* o = Decode<Object*>(ts, java_object);
+    o->MonitorEnter(ts.Self());
+    if (ts.Self()->IsExceptionPending()) {
+      return JNI_ERR;
+    }
+    ts.Env()->monitors.Add(o);
+    return JNI_OK;
   }
 
   static jint MonitorExit(JNIEnv* env, jobject java_object) {
     ScopedJniThreadState ts(env);
-    Decode<Object*>(ts, java_object)->MonitorExit(ts.Self());
-    return ts.Self()->IsExceptionPending() ? JNI_ERR : JNI_OK;
+    Object* o = Decode<Object*>(ts, java_object);
+    o->MonitorExit(ts.Self());
+    if (ts.Self()->IsExceptionPending()) {
+      return JNI_ERR;
+    }
+    ts.Env()->monitors.Remove(o);
+    return JNI_OK;
   }
 
   static jint GetJavaVM(JNIEnv* env, JavaVM** vm) {