6646946: Kernel installation failed on Japanese and Chinese XP SP2 (VM part)
Convert strings from Download Manager into native encoding in the VM Reviewed-by: sbohne, never, phh, kamg, xlu
This commit is contained in:
parent
1bfa153ebe
commit
218615259d
@ -143,13 +143,43 @@ Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRA
|
|||||||
jstring js = NULL;
|
jstring js = NULL;
|
||||||
{ JavaThread* thread = (JavaThread*)THREAD;
|
{ JavaThread* thread = (JavaThread*)THREAD;
|
||||||
assert(thread->is_Java_thread(), "must be java thread");
|
assert(thread->is_Java_thread(), "must be java thread");
|
||||||
ThreadToNativeFromVM ttn(thread);
|
|
||||||
HandleMark hm(thread);
|
HandleMark hm(thread);
|
||||||
|
ThreadToNativeFromVM ttn(thread);
|
||||||
js = (_to_java_string_fn)(thread->jni_environment(), str);
|
js = (_to_java_string_fn)(thread->jni_environment(), str);
|
||||||
}
|
}
|
||||||
return Handle(THREAD, JNIHandles::resolve(js));
|
return Handle(THREAD, JNIHandles::resolve(js));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts a Java String to a native C string that can be used for
|
||||||
|
// native OS calls.
|
||||||
|
char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
|
||||||
|
|
||||||
|
typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
|
||||||
|
static to_platform_string_fn_t _to_platform_string_fn = NULL;
|
||||||
|
|
||||||
|
if (_to_platform_string_fn == NULL) {
|
||||||
|
void *lib_handle = os::native_java_library();
|
||||||
|
_to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, hpi::dll_lookup(lib_handle, "GetStringPlatformChars"));
|
||||||
|
if (_to_platform_string_fn == NULL) {
|
||||||
|
fatal("GetStringPlatformChars missing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *native_platform_string;
|
||||||
|
{ JavaThread* thread = (JavaThread*)THREAD;
|
||||||
|
assert(thread->is_Java_thread(), "must be java thread");
|
||||||
|
JNIEnv *env = thread->jni_environment();
|
||||||
|
jstring js = (jstring) JNIHandles::make_local(env, java_string());
|
||||||
|
bool is_copy;
|
||||||
|
HandleMark hm(thread);
|
||||||
|
ThreadToNativeFromVM ttn(thread);
|
||||||
|
native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
|
||||||
|
assert(is_copy == JNI_TRUE, "is_copy value changed");
|
||||||
|
JNIHandles::destroy_local(js);
|
||||||
|
}
|
||||||
|
return native_platform_string;
|
||||||
|
}
|
||||||
|
|
||||||
Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
|
Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
|
||||||
oop obj = java_string();
|
oop obj = java_string();
|
||||||
// Typical usage is to convert all '/' to '.' in string.
|
// Typical usage is to convert all '/' to '.' in string.
|
||||||
|
@ -96,6 +96,7 @@ class java_lang_String : AllStatic {
|
|||||||
// String converters
|
// String converters
|
||||||
static char* as_utf8_string(oop java_string);
|
static char* as_utf8_string(oop java_string);
|
||||||
static char* as_utf8_string(oop java_string, int start, int len);
|
static char* as_utf8_string(oop java_string, int start, int len);
|
||||||
|
static char* as_platform_dependent_str(Handle java_string, TRAPS);
|
||||||
static jchar* as_unicode_string(oop java_string, int& length);
|
static jchar* as_unicode_string(oop java_string, int& length);
|
||||||
|
|
||||||
static bool equals(oop java_string, jchar* chars, int len);
|
static bool equals(oop java_string, jchar* chars, int len);
|
||||||
|
@ -1242,7 +1242,9 @@ static instanceKlassHandle download_and_retry_class_load(
|
|||||||
oop obj = (oop) result.get_jobject();
|
oop obj = (oop) result.get_jobject();
|
||||||
if (obj == NULL) { return nk; }
|
if (obj == NULL) { return nk; }
|
||||||
|
|
||||||
char* new_class_name = java_lang_String::as_utf8_string(obj);
|
Handle h_obj(THREAD, obj);
|
||||||
|
char* new_class_name = java_lang_String::as_platform_dependent_str(h_obj,
|
||||||
|
CHECK_(nk));
|
||||||
|
|
||||||
// lock the loader
|
// lock the loader
|
||||||
// we use this lock because JVMTI does.
|
// we use this lock because JVMTI does.
|
||||||
|
Loading…
Reference in New Issue
Block a user