From f1e08a23facb2d718276b3fbf59b0df2b54fceb9 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Tue, 27 May 2008 10:06:20 +0000 Subject: Changed implementation of ArgumentIsString to work with wide-character null-terminated strings on Windows. Changed Windows dynamic linker to use LoadLibraryW which is the only variant available on Windows CE. Changed GetProcAddress to explicitly named GetProcAddressA; this is implicitly the only variant available on Windows XP. Tested by compiling gluegen-rt.dll for both Windows XP and Windows CE. Also brought dynlink-unix-CustomJavaCode.java in line with modifications that were apparently hand made to the UnixDynamicLinkerImpl and MacOSXDynamicLinkerImpl classes. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@79 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- src/native/windows/WindowsDynamicLinkerImpl_JNI.c | 53 ++++++++++++----------- 1 file changed, 28 insertions(+), 25 deletions(-) (limited to 'src/native/windows/WindowsDynamicLinkerImpl_JNI.c') diff --git a/src/native/windows/WindowsDynamicLinkerImpl_JNI.c b/src/native/windows/WindowsDynamicLinkerImpl_JNI.c index db20b15..63afd99 100755 --- a/src/native/windows/WindowsDynamicLinkerImpl_JNI.c +++ b/src/native/windows/WindowsDynamicLinkerImpl_JNI.c @@ -1,14 +1,20 @@ -/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Mon Jul 31 16:26:59 PDT 2006 ----! */ +/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Tue May 27 02:37:55 PDT 2008 ----! */ #include +#include #include #include - /* This typedef is apparently needed for compilers before VC8 */ - #if _MSC_VER < 1400 + /* This typedef is apparently needed for compilers before VC8, + and for the embedded ARM compilers we're using */ + #if (_MSC_VER < 1400) || defined(UNDER_CE) typedef int intptr_t; #endif + /* GetProcAddress doesn't exist in A/W variants under desktop Windows */ + #ifndef UNDER_CE + #define GetProcAddressA GetProcAddress + #endif /* Java->C glue code: * Java package: com.sun.gluegen.runtime.WindowsDynamicLinkerImpl @@ -38,26 +44,24 @@ Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_GetLastError__(JNIEnv *env /* Java->C glue code: * Java package: com.sun.gluegen.runtime.WindowsDynamicLinkerImpl - * Java method: long GetProcAddress(long hModule, java.lang.String lpProcName) - * C function: PROC GetProcAddress(HANDLE hModule, LPCSTR lpProcName); + * Java method: long GetProcAddressA(long hModule, java.lang.String lpProcName) + * C function: PROC GetProcAddressA(HANDLE hModule, LPCSTR lpProcName); */ JNIEXPORT jlong JNICALL -Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_GetProcAddress__JLjava_lang_String_2(JNIEnv *env, jclass _unused, jlong hModule, jstring lpProcName) { - const char* _UTF8lpProcName = NULL; +Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_GetProcAddressA__JLjava_lang_String_2(JNIEnv *env, jclass _unused, jlong hModule, jstring lpProcName) { + const char* _strchars_lpProcName = NULL; PROC _res; if (lpProcName != NULL) { - if (lpProcName != NULL) { - _UTF8lpProcName = (*env)->GetStringUTFChars(env, lpProcName, (jboolean*)NULL); - if (_UTF8lpProcName == NULL) { + _strchars_lpProcName = (*env)->GetStringUTFChars(env, lpProcName, (jboolean*)NULL); + if (_strchars_lpProcName == NULL) { (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"lpProcName\" in native dispatcher for \"GetProcAddress\""); + "Failed to get UTF-8 chars for argument \"lpProcName\" in native dispatcher for \"GetProcAddressA\""); return 0; } - } } - _res = GetProcAddress((HANDLE) (intptr_t) hModule, (LPCSTR) _UTF8lpProcName); + _res = GetProcAddressA((HANDLE) (intptr_t) hModule, (LPCSTR) _strchars_lpProcName); if (lpProcName != NULL) { - (*env)->ReleaseStringUTFChars(env, lpProcName, _UTF8lpProcName); + (*env)->ReleaseStringUTFChars(env, lpProcName, _strchars_lpProcName); } return (jlong) (intptr_t) _res; } @@ -65,26 +69,25 @@ Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_GetProcAddress__JLjava_lan /* Java->C glue code: * Java package: com.sun.gluegen.runtime.WindowsDynamicLinkerImpl - * Java method: long LoadLibraryA(java.lang.String lpLibFileName) - * C function: HANDLE LoadLibraryA(LPCSTR lpLibFileName); + * Java method: long LoadLibraryW(java.lang.String lpLibFileName) + * C function: HANDLE LoadLibraryW(LPCWSTR lpLibFileName); */ JNIEXPORT jlong JNICALL -Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_LoadLibraryA__Ljava_lang_String_2(JNIEnv *env, jclass _unused, jstring lpLibFileName) { - const char* _UTF8lpLibFileName = NULL; +Java_com_sun_gluegen_runtime_WindowsDynamicLinkerImpl_LoadLibraryW__Ljava_lang_String_2(JNIEnv *env, jclass _unused, jstring lpLibFileName) { + jchar* _strchars_lpLibFileName = NULL; HANDLE _res; if (lpLibFileName != NULL) { - if (lpLibFileName != NULL) { - _UTF8lpLibFileName = (*env)->GetStringUTFChars(env, lpLibFileName, (jboolean*)NULL); - if (_UTF8lpLibFileName == NULL) { + _strchars_lpLibFileName = (jchar *) calloc((*env)->GetStringLength(env, lpLibFileName) + 1, sizeof(jchar)); + if (_strchars_lpLibFileName == NULL) { (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"), - "Failed to get UTF-8 chars for argument \"lpLibFileName\" in native dispatcher for \"LoadLibraryA\""); + "Could not allocate temporary buffer for copying string argument \"lpLibFileName\" in native dispatcher for \"LoadLibraryW\""); return 0; } - } + (*env)->GetStringRegion(env, lpLibFileName, 0, (*env)->GetStringLength(env, lpLibFileName), _strchars_lpLibFileName); } - _res = LoadLibraryA((LPCSTR) _UTF8lpLibFileName); + _res = LoadLibraryW((LPCWSTR) _strchars_lpLibFileName); if (lpLibFileName != NULL) { - (*env)->ReleaseStringUTFChars(env, lpLibFileName, _UTF8lpLibFileName); + free((void*) _strchars_lpLibFileName); } return (jlong) (intptr_t) _res; } -- cgit v1.2.3