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