[kaffe] Problem with JNI...

Timothy Stack stack at cs.utah.edu
Tue Jun 4 12:09:25 PDT 2002


> Hi!

hi again,

It looks like i forgot to add some code needed by some other changes, can
you try the attached patch and see if it works.  You'll need to run
developers/autogen.sh because theres a configure.in change.

> regards Martin

sorry about the inconvenience,

tim stack
-------------- next part --------------
Index: acinclude.m4
===================================================================
RCS file: /cvs/kaffe/kaffe/acinclude.m4,v
retrieving revision 1.22
diff -u -r1.22 acinclude.m4
--- acinclude.m4	6 May 2002 02:59:55 -0000	1.22
+++ acinclude.m4	4 Jun 2002 19:00:13 -0000
@@ -3451,6 +3451,26 @@
 ])
 
 
+# AC_LTDL_SHLIBEXT
+# ----------------
+AC_DEFUN(AC_LTDL_SHLIBEXT,
+[AC_REQUIRE([_LT_AC_LTCONFIG_HACK])
+AC_CACHE_CHECK([which extension is used for shared libraries],
+  libltdl_cv_shlibext,
+[ac_last=
+  for ac_spec in $library_names_spec; do
+    ac_last="$ac_spec"
+  done
+  echo "$ac_last" | [sed 's/\[.*\]//;s/^[^.]*//;s/\$.*$//;s/\.$//'] > conftest
+libltdl_cv_shlibext=`cat conftest`
+rm -f conftest
+])
+if test -n "$libltdl_cv_shlibext"; then
+  AC_DEFINE_UNQUOTED(LTDL_SHLIB_EXT, "$libltdl_cv_shlibext",
+    [Define to the extension used for shared libraries, say, ".so". ])
+fi
+])# AC_LTDL_SHLIBEXT
+
 # AC_PROG_NM - find the path to a BSD-compatible name lister
 AC_DEFUN([AC_PROG_NM],
 [AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
Index: configure.in
===================================================================
RCS file: /cvs/kaffe/kaffe/configure.in,v
retrieving revision 1.164
diff -u -r1.164 configure.in
--- configure.in	2 Jun 2002 16:02:57 -0000	1.164
+++ configure.in	4 Jun 2002 19:00:24 -0000
@@ -130,6 +130,7 @@
 
 AC_LIBTOOL_DLOPEN
 AC_LIBLTDL_CONVENIENCE
+AC_REQUIRE([AC_LTDL_SHLIBEXT])
 AC_PROG_LIBTOOL
 AC_SUBST(LIBTOOL_DEPS)
 AC_SUBST(LIBLTDL)
Index: external.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/external.c,v
retrieving revision 1.39
diff -u -r1.39 external.c
--- external.c	3 Aug 2001 17:38:49 -0000	1.39
+++ external.c	4 Jun 2002 19:00:41 -0000
@@ -66,7 +66,7 @@
 #endif
 
 #ifndef LIBRARYLOAD
-#define LIBRARYLOAD(desc,filename)	((desc)=lt_dlopenext((filename)))
+#define LIBRARYLOAD(desc,filename)	((desc)=lt_dlopen((filename)))
 #endif
 
 #ifndef LIBRARYUNLOAD
@@ -184,6 +184,24 @@
 	return( retval );
 }
 
+/* Standard libtool archive file extension.  */
+#undef  LTDL_ARCHIVE_EXT
+#define LTDL_ARCHIVE_EXT	".la"
+
+static char *libSuffixes[] = {
+	LTDL_ARCHIVE_EXT,
+#ifdef LTDL_SHLIB_EXT
+	LTDL_SHLIB_EXT,
+#endif
+	0
+};
+
+enum {
+	TRY_LOAD_FOUND,
+	TRY_LOAD_NOT_FOUND,
+	TRY_LOAD_ERROR,
+};
+
 /*
  * Link in a native library. If successful, returns an index >= 0 that
  * can be passed to unloadNativeLibrary(). Otherwise, returns -1 and
@@ -193,7 +211,7 @@
 loadNativeLibrary2(char* path, int default_refs, char *errbuf, size_t errsiz)
 {
 	struct _libHandle *lib;
-	int index;
+	int index, status;
 
 	/* Find a library handle.  If we find the library has already
 	 * been loaded, don't bother to get it again, just increase the
@@ -236,25 +254,59 @@
 /* if we tested for existence here, libltdl wouldn't be able to look
    for system-dependent library names */
 
+	lib->name = KMALLOC(strlen(path)
+			    + 16 /* XXX extension */
+			    + 1);
+	
 	blockAsyncSignals();
-	LIBRARYLOAD(lib->desc, path);
+	{
+		int lpc;
+
+		status = TRY_LOAD_NOT_FOUND;
+		for( lpc = 0;
+		     (status == TRY_LOAD_NOT_FOUND) && libSuffixes[lpc];
+		     lpc++ )
+		{
+			sprintf(lib->name, "%s%s", path, libSuffixes[lpc]);
+			LIBRARYLOAD(lib->desc, lib->name);
+			if( lib->desc )
+			{
+				status = TRY_LOAD_FOUND;
+			}
+			else
+			{
+				const char *err = LIBRARYERROR();
+				
+				/* XXX Bleh, silly guessing system. */
+				if( err == 0 )
+				{
+					status = TRY_LOAD_ERROR;
+					strncpy(errbuf,
+						"Unknown error",
+						errsiz);
+				}
+				else if( (strstr(err, "ile not found") ||
+					  strstr(err, "annot open")) )
+				{
+					status = TRY_LOAD_NOT_FOUND;
+				}
+				else
+				{
+					/* We'll assume its a real error. */
+					status = TRY_LOAD_ERROR;
+					strncpy(errbuf, err, errsiz);
+				}
+			}
+		}
+	}
 	unblockAsyncSignals();
 
 	if (lib->desc == 0) {
-		const char *err = LIBRARYERROR();
-
-		if (err == 0) {
-			err = "Unknown error";
-		}
-		if (errbuf != 0) {
-			strncpy(errbuf, err, errsiz);
-			errbuf[errsiz - 1] = '\0';
-		}
+		errbuf[errsiz - 1] = '\0';
 		return -1;
 	}
 
 	lib->ref = default_refs;
-	lib->name = KMALLOC(strlen(path) + 1);
 	addToCounter(&ltmem, "vmmem-libltdl", 1, GCSIZEOF(lib->name));
 	strcpy(lib->name, path);
 


More information about the kaffe mailing list