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<PrimitiveType>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