Use GetByteArrayRegion instead of GetByteArrayElements.

I've also cleaned up the two calls to free(3) in ubidi_close; the former had
an unnecessary NULL check, and the latter was indented as if it belonged to the
if (but didn't).

Tested on sapphire-eng.
diff --git a/libcore/icu/src/main/native/BidiWrapperInterface.c b/libcore/icu/src/main/native/BidiWrapperInterface.c
index 2c6b3cd..55be7a0 100644
--- a/libcore/icu/src/main/native/BidiWrapperInterface.c
+++ b/libcore/icu/src/main/native/BidiWrapperInterface.c
@@ -43,44 +43,34 @@
 
   ubidi_close ((*data).pBiDi);
   
-  if ((*data).embeddingLevels != NULL)
-    free((*data).embeddingLevels);
-    free(data);
+  free((*data).embeddingLevels);
+  free(data);
 }
 
 JNIEXPORT void JNICALL Java_org_apache_harmony_text_BidiWrapper_ubidi_1setPara
   (JNIEnv * env, jclass clazz, jlong pBiDi, jcharArray text, jint length,
-   jbyte paraLevel, jbyteArray embeddingLevels)
+   jbyte paraLevel, jbyteArray newEmbeddingLevels)
 {
-  UErrorCode err = 0;
-  jchar *_text = NULL;
   BiDiData *data = (BiDiData *)pBiDi;
-  /* Remembering old embedding levels */
-  void *embLvls = (*data).embeddingLevels;
-  
-  _text = (*env)->GetCharArrayElements (env, text, NULL);
+  void *oldEmbeddingLevels = (*data).embeddingLevels;
 
-  if (embeddingLevels != NULL)
-    {        
-        jbyte *el = (*env)->GetByteArrayElements (env, embeddingLevels, NULL);
-        (*data).embeddingLevels = malloc(length);
-        memcpy(((*data).embeddingLevels), el, length);
-        (*env)->ReleaseByteArrayElements (env, embeddingLevels, el, 0);
-    } else
-    {
-        (*data).embeddingLevels = NULL;
-    }
-
-  ubidi_setPara ((*data).pBiDi, _text, length, paraLevel,
-                 ((*data).embeddingLevels), &err);
-  check_fail (env, err);
-
-  /* Freeing old embedding levels */
-  if (embLvls != NULL) {
-    free(embLvls);
+  // Copy the new embedding levels from the Java heap to the native heap.
+  if (newEmbeddingLevels != NULL) {
+    (*data).embeddingLevels = malloc(length);
+    (*env)->GetByteArrayRegion(env, newEmbeddingLevels, 0, length,
+                               (*data).embeddingLevels);
+  } else {
+    (*data).embeddingLevels = NULL;
   }
 
+  UErrorCode err = 0;
+  jchar* _text = (*env)->GetCharArrayElements(env, text, NULL);
+  ubidi_setPara ((*data).pBiDi, _text, length, paraLevel,
+                 ((*data).embeddingLevels), &err);
   (*env)->ReleaseCharArrayElements (env, text, _text, 0);
+  check_fail (env, err);
+
+  free(oldEmbeddingLevels);
 }
 
 JNIEXPORT jlong JNICALL Java_org_apache_harmony_text_BidiWrapper_ubidi_1setLine