< prev index next >
src/share/vm/prims/jni.cpp
Print this page
*** 2472,2487 ****
jchar* buf = NULL;
oop s = JNIHandles::resolve_non_null(string);
typeArrayOop s_value = java_lang_String::value(s);
if (s_value != NULL) {
int s_len = java_lang_String::length(s);
! int s_offset = java_lang_String::offset(s);
buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
/* JNI Specification states return NULL on OOM */
if (buf != NULL) {
if (s_len > 0) {
! memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
}
buf[s_len] = 0;
//%note jni_5
if (isCopy != NULL) {
*isCopy = JNI_TRUE;
--- 2472,2493 ----
jchar* buf = NULL;
oop s = JNIHandles::resolve_non_null(string);
typeArrayOop s_value = java_lang_String::value(s);
if (s_value != NULL) {
int s_len = java_lang_String::length(s);
! bool is_latin1 = java_lang_String::is_latin1(s);
buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
/* JNI Specification states return NULL on OOM */
if (buf != NULL) {
if (s_len > 0) {
! if (!is_latin1) {
! memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len);
! } else {
! for (int i = 0; i < s_len; i++) {
! buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
! }
! }
}
buf[s_len] = 0;
//%note jni_5
if (isCopy != NULL) {
*isCopy = JNI_TRUE;
*** 3116,3128 ****
int s_len = java_lang_String::length(s);
if (start < 0 || len < 0 || start + len > s_len) {
THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
} else {
if (len > 0) {
- int s_offset = java_lang_String::offset(s);
typeArrayOop s_value = java_lang_String::value(s);
! memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
}
}
JNI_END
DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
--- 3122,3140 ----
int s_len = java_lang_String::length(s);
if (start < 0 || len < 0 || start + len > s_len) {
THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
} else {
if (len > 0) {
typeArrayOop s_value = java_lang_String::value(s);
! bool is_latin1 = java_lang_String::is_latin1(s);
! if (!is_latin1) {
! memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len);
! } else {
! for (int i = 0; i < len; i++) {
! buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
! }
! }
}
}
JNI_END
DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
*** 3184,3215 ****
JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
JNIWrapper("GetStringCritical");
HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
GC_locker::lock_critical(thread);
- if (isCopy != NULL) {
- *isCopy = JNI_FALSE;
- }
oop s = JNIHandles::resolve_non_null(string);
- int s_len = java_lang_String::length(s);
typeArrayOop s_value = java_lang_String::value(s);
! int s_offset = java_lang_String::offset(s);
const jchar* ret;
! if (s_len > 0) {
! ret = s_value->char_at_addr(s_offset);
} else {
! ret = (jchar*) s_value->base(T_CHAR);
}
HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
return ret;
JNI_END
JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
JNIWrapper("ReleaseStringCritical");
HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
! // The str and chars arguments are ignored
GC_locker::unlock_critical(thread);
HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
JNI_END
--- 3196,3239 ----
JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
JNIWrapper("GetStringCritical");
HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
GC_locker::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);
! if (isCopy != NULL) {
! *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
! }
const jchar* ret;
! if (!is_latin1) {
! ret = s_value->char_at_addr(0);
} else {
! // Inflate latin1 encoded string to UTF16
! int s_len = java_lang_String::length(s);
! jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal);
! for (int i = 0; i < s_len; i++) {
! buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
! }
! ret = &buf[0];
}
HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
return ret;
JNI_END
JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
JNIWrapper("ReleaseStringCritical");
HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
! // The str and chars arguments are ignored for UTF16 strings
! oop s = JNIHandles::resolve_non_null(str);
! bool is_latin1 = java_lang_String::is_latin1(s);
! if (is_latin1) {
! // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
! // This assumes that ReleaseStringCritical bookends GetStringCritical.
! FREE_C_HEAP_ARRAY(jchar, chars);
! }
GC_locker::unlock_critical(thread);
HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
JNI_END
< prev index next >