win32.h (_Jv_platform_solib_prefix): New define.
authorTom Tromey <tromey@redhat.com>
Tue, 10 Dec 2002 01:39:32 +0000 (01:39 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Tue, 10 Dec 2002 01:39:32 +0000 (01:39 +0000)
* 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
libjava/include/posix.h
libjava/include/win32.h
libjava/java/lang/natRuntime.cc

index 7ec6424e7daaea610bdb0c080626741f41ca25d7..3e1fddacc224b2d8b70dcf1dc85859ebfebc2c04 100644 (file)
@@ -1,5 +1,13 @@
 2002-12-09  Tom Tromey  <tromey@redhat.com>
 
+       * 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.
 
index 4bb1d56810f52c901cad7e8dee01893018c0ca9d..cdcdb5d45ac6da1b89d67898833d22a886319b9a 100644 (file)
@@ -40,6 +40,10 @@ details.  */
 #include <gcj/cni.h>
 #include <java/util/Properties.h>
 
+// Prefix and suffix for shared libraries.
+#define _Jv_platform_solib_prefix "lib"
+#define _Jv_platform_solib_suffix ".so"
+
 #ifndef DISABLE_JAVA_NET
 #include <java/net/InetAddress.h>
 #endif
index 62bc0c33cbba396e9a92d03ca6dd742a667a7109..f05f30d12944eb1f8409d78402e39330ce8ceeef 100644 (file)
@@ -22,6 +22,10 @@ details.  */
 
 #include <io.h>
 
+// 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
index 6737dbcbbfafaaa63ff00cc12d20e2c49697d0ad..f5177b0aa3588d84d88e24692b5ff8fb72e095fb 100644 (file)
@@ -27,6 +27,8 @@ details.  */
 #include <java/lang/StringBuffer.h>
 #include <java/lang/Process.h>
 #include <java/lang/ConcreteProcess.h>
+#include <java/lang/ClassLoader.h>
+#include <gnu/gcj/runtime/StackTrace.h>
 
 #include <jni.h>
 
@@ -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();
 }