< prev index next >

src/share/vm/prims/jni.cpp

Print this page
rev 13037 : 8181147: JNI_GetStringPlatformChars should have a fast path for UTF-8
Reviewed-by: shade, chegar, erikj

@@ -2521,10 +2521,44 @@
   }
   HOTSPOT_JNI_RELEASESTRINGCHARS_RETURN();
 JNI_END
 
 
+
+JNI_QUICK_ENTRY(const jbyte*, jni_GetStringBytesCritical(
+  JNIEnv *env, jstring string, jint *len, jbyte *encoding, jboolean *isCopy))
+  JNIWrapper("GetStringBytesCritical");
+ HOTSPOT_JNI_GETSTRINGBYTESCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
+  GCLocker::lock_critical(thread);
+  oop s = JNIHandles::resolve_non_null(string);
+  typeArrayOop s_value = java_lang_String::value(s);
+  bool is_latin1 = java_lang_String::is_latin1(s);
+  assert(len != NULL, "Must provide a pointer to jint for the array length");
+  int s_len = java_lang_String::length(s);
+  int shift = is_latin1 ? 0 : 1;
+  *len = s_len << shift;
+  if (encoding != NULL) {
+    *encoding = shift;
+  }
+  if (isCopy != NULL) {
+    *isCopy = JNI_FALSE;
+  }
+  jbyte* ret = (jbyte*) s_value->base(T_BYTE);
+  HOTSPOT_JNI_GETSTRINGBYTESCRITICAL_RETURN(buf);
+  return ret;
+JNI_END
+
+
+JNI_QUICK_ENTRY(void, jni_ReleaseStringBytesCritical(JNIEnv *env, jstring str, const jbyte *bytes))
+  JNIWrapper("ReleaseStringBytesCritical");
+  HOTSPOT_JNI_RELEASESTRINGBYTESCRITICAL_ENTRY(env, str, (uint8_t *) bytes);
+  // the str and bytes arguments are ignored
+  GCLocker::unlock_critical(thread);
+  HOTSPOT_JNI_RELEASESTRINGBYTESCRITICAL_RETURN();
+JNI_END
+
+
 // UTF Interface
 
 DT_RETURN_MARK_DECL(NewStringUTF, jstring
                     , HOTSPOT_JNI_NEWSTRINGUTF_RETURN(_ret_ref));
 

@@ -3669,10 +3703,12 @@
 
     jni_NewString,
     jni_GetStringLength,
     jni_GetStringChars,
     jni_ReleaseStringChars,
+    jni_GetStringBytesCritical,
+    jni_ReleaseStringBytesCritical,
 
     jni_NewStringUTF,
     jni_GetStringUTFLength,
     jni_GetStringUTFChars,
     jni_ReleaseStringUTFChars,
< prev index next >