Runtime.java (_load): Declare.

* java/lang/Runtime.java (_load): Declare.
	(load, loadLibrary): Wrote in terms of _load.
	* java/lang/natRuntime.cc (load): Call JNI_OnLoad if it appears in
	library.
	(loadLibrary): Likewise.
	Include <jni.h>.
	(_load): New method.
	(loadLibrary, load): Removed.

From-SVN: r31846
This commit is contained in:
Tom Tromey 2000-02-08 00:26:58 +00:00 committed by Tom Tromey
parent 278abd2849
commit 3fd64b5a09
3 changed files with 37 additions and 28 deletions

View file

@ -1,5 +1,14 @@
2000-02-07 Tom Tromey <tromey@cygnus.com>
* java/lang/Runtime.java (_load): Declare.
(load, loadLibrary): Wrote in terms of _load.
* java/lang/natRuntime.cc (load): Call JNI_OnLoad if it appears in
library.
(loadLibrary): Likewise.
Include <jni.h>.
(_load): New method.
(loadLibrary, load): Removed.
* jni.cc (ThrowableClass): New define.
(_Jv_JNI_Throw): Check argument.
(_Jv_JNI_ThrowNew): Likewise.

View file

@ -23,8 +23,7 @@ import java.util.StringTokenizer;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: All 1.1 methods exist. exec(), load(), and loadLibrary()
* are not fully implemented.
* Status: All 1.1 methods exist. exec() is not fully implemented.
*/
public class Runtime
@ -94,8 +93,17 @@ public class Runtime
s.checkLink(lib);
}
public native void load (String pathname);
public native void loadLibrary (String libname);
private native void _load (String pathname, boolean do_search);
public void load (String pathname)
{
_load (pathname, false);
}
public void loadLibrary (String libname)
{
_load (libname, true);
}
// This is a helper function for the ClassLoader which can load
// compiled libraries. Returns true if library (which is just the

View file

@ -18,6 +18,8 @@ details. */
#include <java/lang/UnknownError.h>
#include <java/lang/UnsatisfiedLinkError.h>
#include <jni.h>
#ifdef USE_LTDL
#include <ltdl.h>
@ -99,7 +101,7 @@ java::lang::Runtime::gc (void)
}
void
java::lang::Runtime::load (jstring path)
java::lang::Runtime::_load (jstring path, jboolean do_search)
{
JvSynchronize sync (this);
checkLink (path);
@ -110,39 +112,29 @@ java::lang::Runtime::load (jstring path)
jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
buf[total] = '\0';
// FIXME: make sure path is absolute.
lt_dlhandle h = lt_dlopen (buf);
lt_dlhandle h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf);
if (h == NULL)
{
const char *msg = lt_dlerror ();
_Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 (msg)));
}
#else
_Jv_Throw (new UnknownError
(JvNewStringLatin1 ("Runtime.load not implemented")));
#endif /* USE_LTDL */
}
void
java::lang::Runtime::loadLibrary (jstring lib)
{
JvSynchronize sync (this);
checkLink (lib);
using namespace java::lang;
#ifdef USE_LTDL
jint len = _Jv_GetStringUTFLength (lib);
char buf[len + 1];
jsize total = JvGetStringUTFRegion (lib, 0, lib->length(), buf);
buf[total] = '\0';
// FIXME: make sure path is absolute.
lt_dlhandle h = lt_dlopenext (buf);
if (h == NULL)
void *onload = lt_dlsym (h, "JNI_OnLoad");
if (onload != NULL)
{
const char *msg = lt_dlerror ();
_Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 (msg)));
// FIXME: need invocation API to get JavaVM.
jint vers = ((jint (*) (...)) onload) (NULL, NULL);
if (vers != JNI_VERSION_1_1 && vers != JNI_VERSION_1_2)
{
// FIXME: unload the library.
_Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 ("unrecognized version from JNI_OnLoad")));
}
}
#else
_Jv_Throw (new UnknownError
(JvNewStringLatin1 ("Runtime.loadLibrary not implemented")));
(JvNewStringLatin1 (do_search
? "Runtime.loadLibrary not implemented"
: "Runtime.load not implemented")));
#endif /* USE_LTDL */
}