From 78bb0444d2223d7b3b2089d4b50960f6464d4ba6 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 10 Dec 2002 01:39:32 +0000 Subject: [PATCH] win32.h (_Jv_platform_solib_prefix): New define. * include/win32.h (_Jv_platform_solib_prefix): New define. (_Jv_platform_solib_suffix): Likewise. * include/posix.h (_Jv_platform_solib_prefix): New define. (_Jv_platform_solib_suffix): Likewise. * java/lang/natRuntime.cc: Include StackTrace.h. (_load): Use findLibrary and new platform defines. (nativeGetLibname): Use new platform defines. From-SVN: r59976 --- libjava/ChangeLog | 8 ++++ libjava/include/posix.h | 4 ++ libjava/include/win32.h | 4 ++ libjava/java/lang/natRuntime.cc | 68 ++++++++++++++++++++++++--------- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 7ec6424e7da..3e1fddacc22 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,13 @@ 2002-12-09 Tom Tromey + * include/win32.h (_Jv_platform_solib_prefix): New define. + (_Jv_platform_solib_suffix): Likewise. + * include/posix.h (_Jv_platform_solib_prefix): New define. + (_Jv_platform_solib_suffix): Likewise. + * java/lang/natRuntime.cc: Include StackTrace.h. + (_load): Use findLibrary and new platform defines. + (nativeGetLibname): Use new platform defines. + * java/util/natResourceBundle.cc (getCallingClassLoader): Assume `t' won't be null. diff --git a/libjava/include/posix.h b/libjava/include/posix.h index 4bb1d56810f..cdcdb5d45ac 100644 --- a/libjava/include/posix.h +++ b/libjava/include/posix.h @@ -40,6 +40,10 @@ details. */ #include #include +// Prefix and suffix for shared libraries. +#define _Jv_platform_solib_prefix "lib" +#define _Jv_platform_solib_suffix ".so" + #ifndef DISABLE_JAVA_NET #include #endif diff --git a/libjava/include/win32.h b/libjava/include/win32.h index 62bc0c33cbb..f05f30d1294 100644 --- a/libjava/include/win32.h +++ b/libjava/include/win32.h @@ -22,6 +22,10 @@ details. */ #include +// Prefix and suffix for shared libraries. +#define _Jv_platform_solib_prefix "" +#define _Jv_platform_solib_suffix ".dll" + #ifndef DISBALE_JAVA_NET // these errors cannot occur on Win32 diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc index 6737dbcbbfa..f5177b0aa35 100644 --- a/libjava/java/lang/natRuntime.cc +++ b/libjava/java/lang/natRuntime.cc @@ -27,6 +27,8 @@ details. */ #include #include #include +#include +#include #include @@ -161,18 +163,56 @@ java::lang::Runtime::_load (jstring path, jboolean do_search) using namespace java::lang; #ifdef USE_LTDL jint len = _Jv_GetStringUTFLength (path); - char buf[len + 1 + 3]; + char buf[len + 1 + strlen (_Jv_platform_solib_prefix) + + strlen (_Jv_platform_solib_suffix)]; int offset = 0; -#ifndef WIN32 - // On Unix boxes, prefix library name with `lib', for loadLibrary. if (do_search) { - strcpy (buf, "lib"); - offset = 3; + strcpy (buf, _Jv_platform_solib_prefix); + offset = strlen (_Jv_platform_solib_prefix); } -#endif jsize total = JvGetStringUTFRegion (path, 0, path->length(), &buf[offset]); buf[offset + total] = '\0'; + + char *lib_name = buf; + + if (do_search) + { + ClassLoader *sys = ClassLoader::getSystemClassLoader(); + ClassLoader *look = NULL; + gnu::gcj::runtime::StackTrace *t = new gnu::gcj::runtime::StackTrace(10); + for (int i = 0; i < 10; ++i) + { + jclass klass = t->classAt(i); + if (klass != NULL) + { + ClassLoader *loader = klass->getClassLoaderInternal(); + if (loader != NULL && loader != sys) + { + look = loader; + break; + } + } + } + if (look != NULL) + { + // Don't include solib prefix in string passed to + // findLibrary. + jstring name = look->findLibrary(JvNewStringUTF(&buf[offset])); + if (name != NULL) + { + len = _Jv_GetStringUTFLength (name); + lib_name = (char *) _Jv_AllocBytes(len + 1); + total = JvGetStringUTFRegion (name, 0, + name->length(), lib_name); + lib_name[total] = '\0'; + // Don't append suffixes any more; we have the full file + // name. + do_search = false; + } + } + } + lt_dlhandle h; // FIXME: make sure path is absolute. { @@ -180,7 +220,7 @@ java::lang::Runtime::_load (jstring path, jboolean do_search) // concurrent modification by class registration calls which may be run // during the dlopen(). JvSynchronize sync (&java::lang::Class::class$); - h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf); + h = do_search ? lt_dlopenext (lib_name) : lt_dlopen (lib_name); } if (h == NULL) { @@ -602,19 +642,9 @@ java::lang::Runtime::nativeGetLibname (jstring pathname, jstring libname) #endif } - // FIXME: use platform function here. -#ifndef WIN32 - sb->append (JvNewStringLatin1 ("lib")); -#endif - + sb->append (JvNewStringLatin1 (_Jv_platform_solib_prefix)); sb->append(libname); - - // FIXME: use platform function here. -#ifdef WIN32 - sb->append (JvNewStringLatin1 ("dll")); -#else - sb->append (JvNewStringLatin1 ("so")); -#endif + sb->append (JvNewStringLatin1 (_Jv_platform_solib_suffix)); return sb->toString(); } -- 2.30.2