Fix unnecessary GetPrimitiveArrayCritical users.

Tested on sapphire-eng.

Bug: 1639287
diff --git a/docs/jni-tips.html b/docs/jni-tips.html
index 881f534..002fcb7 100644
--- a/docs/jni-tips.html
+++ b/docs/jni-tips.html
@@ -344,7 +344,7 @@
     <li>MonitorExit
     <li>PopLocalFrame
     <li>PushLocalFrame
-    <li>Release<PrimitiveType>ArrayElements
+    <li>Release&lt;PrimitiveType&gt;ArrayElements
     <li>ReleasePrimitiveArrayCritical
     <li>ReleaseStringChars
     <li>ReleaseStringCritical
diff --git a/libcore/archive/src/main/native/java_util_zip_Deflater.c b/libcore/archive/src/main/native/java_util_zip_Deflater.c
index 2e0e268..47347e6 100644
--- a/libcore/archive/src/main/native/java_util_zip_Deflater.c
+++ b/libcore/archive/src/main/native/java_util_zip_Deflater.c
@@ -162,29 +162,19 @@
 {
   PORT_ACCESS_FROM_ENV (env);
 
-  jbyte *in;
-  JCLZipStream *stream;
-
-  stream = (JCLZipStream *) ((IDATA) handle);
-  if (stream->inaddr != NULL)	/*Input has already been provided, free the old buffer */
+  JCLZipStream* stream = (JCLZipStream *) ((IDATA) handle);
+  if (stream->inaddr != NULL) {
+    /* Input has already been provided, free the old buffer. */
     jclmem_free_memory (env, stream->inaddr);
+  }
   stream->inaddr = jclmem_allocate_memory (env, len);
-  if (stream->inaddr == NULL)
-    {
-      throwNewOutOfMemoryError (env, "");
-      return;
-    }
-  in = ((*env)->GetPrimitiveArrayCritical (env, buf, 0));
-  if (in == NULL) {
-    throwNewOutOfMemoryError(env, "");
+  if (stream->inaddr == NULL) {
+    throwNewOutOfMemoryError (env, "");
     return;
   }
-  memcpy (stream->inaddr, (in + off), len);
-  ((*env)->ReleasePrimitiveArrayCritical (env, buf, in, JNI_ABORT));
+  (*env)->GetByteArrayRegion(env, buf, off, len, (jbyte*) stream->inaddr);
   stream->stream->next_in = (Bytef *) stream->inaddr;
   stream->stream->avail_in = len;
-
-  return;
 }
 
 JNIEXPORT jint JNICALL
diff --git a/libcore/archive/src/main/native/java_util_zip_Inflater.c b/libcore/archive/src/main/native/java_util_zip_Inflater.c
index 4b30d4e..c04a223 100644
--- a/libcore/archive/src/main/native/java_util_zip_Inflater.c
+++ b/libcore/archive/src/main/native/java_util_zip_Inflater.c
@@ -104,29 +104,20 @@
 {
   PORT_ACCESS_FROM_ENV (env);
 
-  jbyte *in;
-  U_8 *baseAddr;
   JCLZipStream *stream = (JCLZipStream *) ((IDATA) handle);
-
-  if (stream->inaddr != NULL)   /*Input has already been provided, free the old buffer */
+  if (stream->inaddr != NULL) {
+    /* Input has already been provided, free the old buffer. */
     jclmem_free_memory (env, stream->inaddr);
-  baseAddr = jclmem_allocate_memory (env, len);
-  if (baseAddr == NULL)
-    {
-      throwNewOutOfMemoryError (env, "");
-      return;
-    }
+  }
+  U_8* baseAddr = jclmem_allocate_memory (env, len);
+  if (baseAddr == NULL) {
+    throwNewOutOfMemoryError (env, "");
+    return;
+  }
   stream->inaddr = baseAddr;
   stream->stream->next_in = (Bytef *) baseAddr;
   stream->stream->avail_in = len;
-  in = ((*env)->GetPrimitiveArrayCritical (env, buf, 0));
-  if (in == NULL) {
-    throwNewOutOfMemoryError(env, "");
-    return;
-  }
-  memcpy (baseAddr, (in + off), len);
-  ((*env)->ReleasePrimitiveArrayCritical (env, buf, in, JNI_ABORT));
-  return;
+  (*env)->GetByteArrayRegion(env, buf, off, len, (jbyte*) baseAddr);
 }
 
 JNIEXPORT jint JNICALL
diff --git a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
index 2e814cc..b1493f8 100644
--- a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
+++ b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
@@ -144,9 +144,8 @@
  */
 static void harmony_nio_getBytesImpl(JNIEnv *_env, jobject _this, jint pointer, 
         jbyteArray dst, jint offset, jint length) {
-    jbyte *dst_ = (jbyte *)_env->GetPrimitiveArrayCritical(dst, (jboolean *)0);
-    memcpy(dst_ + offset, (jbyte *)pointer, length);
-    _env->ReleasePrimitiveArrayCritical(dst, dst_, 0);
+    jbyte* src = reinterpret_cast<jbyte*>(static_cast<uintptr_t>(pointer));
+    _env->SetByteArrayRegion(dst, offset, length, src);
 }
 
 /*
@@ -166,9 +165,8 @@
  */
 static void harmony_nio_putBytesImpl(JNIEnv *_env, jobject _this,
         jint pointer, jbyteArray src, jint offset, jint length) {
-    jbyte *src_ = (jbyte *)_env->GetPrimitiveArrayCritical(src, (jboolean *)0);
-    memcpy((jbyte *)pointer, src_ + offset, length);
-    _env->ReleasePrimitiveArrayCritical(src, src_, JNI_ABORT);
+    jbyte* dst = reinterpret_cast<jbyte*>(static_cast<uintptr_t>(pointer));
+    _env->GetByteArrayRegion(src, offset, length, dst);
 }
 
 static void