6646946: Kernel installation failed on Japanese and Chinese XP SP2 (VM part)
Summary: convert strings from Download Manager into native encoding in the VM
Reviewed-by: sbohne, never, phh, kamg, xlu
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Dec 06 13:59:28 2007 -0800
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Jan 17 13:38:17 2008 -0800
@@ -143,13 +143,43 @@
jstring js = NULL;
{ JavaThread* thread = (JavaThread*)THREAD;
assert(thread->is_Java_thread(), "must be java thread");
+ HandleMark hm(thread);
ThreadToNativeFromVM ttn(thread);
- HandleMark hm(thread);
js = (_to_java_string_fn)(thread->jni_environment(), str);
}
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) {
oop obj = java_string();
// Typical usage is to convert all '/' to '.' in string.
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Dec 06 13:59:28 2007 -0800
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Jan 17 13:38:17 2008 -0800
@@ -96,6 +96,7 @@
// String converters
static char* as_utf8_string(oop java_string);
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 bool equals(oop java_string, jchar* chars, int len);
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Thu Dec 06 13:59:28 2007 -0800
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Thu Jan 17 13:38:17 2008 -0800
@@ -1242,7 +1242,9 @@
oop obj = (oop) result.get_jobject();
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
// we use this lock because JVMTI does.