OSDN Git Service

Add way to warn about missing JNI_ABORT
authorMathieu Chartier <mathieuc@google.com>
Mon, 6 Oct 2014 20:41:33 +0000 (13:41 -0700)
committerMathieu Chartier <mathieuc@google.com>
Mon, 6 Oct 2014 21:19:20 +0000 (14:19 -0700)
Bug: 16858794
Change-Id: I6794a14ee323ef95569cc7646619e6869771c7c6

runtime/jni_internal.cc

index bf979c1..dea3014 100644 (file)
 
 namespace art {
 
+// Consider turning this on when there is errors which could be related to JNI array copies such as
+// things not rendering correctly. E.g. b/16858794
+static constexpr bool kWarnJniAbort = false;
+
 // Section 12.3.2 of the JNI spec describes JNI class descriptors. They're
 // separated with slashes but aren't wrapped with "L;" like regular descriptors
 // (i.e. "a/b/C" rather than "La/b/C;"). Arrays of reference types are an
@@ -2375,10 +2379,13 @@ class JNI {
                             reinterpret_cast<void*>(elements), array_data);
         return;
       }
-    }
-    // Don't need to copy if we had a direct pointer.
-    if (mode != JNI_ABORT && is_copy) {
-      memcpy(array_data, elements, bytes);
+      if (mode != JNI_ABORT) {
+        memcpy(array_data, elements, bytes);
+      } else if (kWarnJniAbort && memcmp(array_data, elements, bytes) != 0) {
+        // Warn if we have JNI_ABORT and the arrays don't match since this is usually an error.
+        LOG(WARNING) << "Possible incorrect JNI_ABORT in Release*ArrayElements";
+        soa.Self()->DumpJavaStack(LOG(WARNING));
+      }
     }
     if (mode != JNI_COMMIT) {
       if (is_copy) {