Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: native.c 7910 2007-05-16 08:02:52Z twisti $
+ $Id: native.c 8132 2007-06-22 11:15:47Z twisti $
*/
# include <ltdl.h>
#endif
+#include <stdint.h>
+
#include "vm/types.h"
#include "mm/memory.h"
tree_native_methods = avl_create(&native_tree_native_methods_comparator);
- /* register the intern native functions */
-
- nativevm_init();
-
/* everything's ok */
return true;
treenmn = treenode;
nmn = node;
- /* compare for avl_find if we have found an entry */
-
- if (treenmn->name == nmn->name)
- return 0;
-
/* these are for walking the tree */
+ if (treenmn->classname < nmn->classname)
+ return -1;
+ else if (treenmn->classname > nmn->classname)
+ return 1;
+
if (treenmn->name < nmn->name)
return -1;
- else
+ else if (treenmn->name > nmn->name)
+ return 1;
+
+ if (treenmn->descriptor < nmn->descriptor)
+ return -1;
+ else if (treenmn->descriptor > nmn->descriptor)
return 1;
+
+ /* all pointers are equal, we have found the entry */
+
+ return 0;
}
*******************************************************************************/
-void native_method_register(utf *classname, JNINativeMethod *methods, s4 count)
+void native_method_register(utf *classname, const JNINativeMethod *methods,
+ int32_t count)
{
native_methods_node_t *nmn;
- utf *methodname;
utf *name;
- s4 i;
+ utf *descriptor;
+ int32_t i;
/* insert all methods passed */
printf(".%s]\n", methods[i].name);
}
- /* generate the method-symbol string */
+ /* generate the utf8 names */
- methodname = utf_new_char(methods[i].name);
- name = native_method_symbol(classname, methodname);
+ name = utf_new_char(methods[i].name);
+ descriptor = utf_new_char(methods[i].signature);
/* allocate a new tree node */
nmn = NEW(native_methods_node_t);
- nmn->name = name;
- nmn->method = (functionptr) (ptrint) methods[i].fnPtr;
+ nmn->classname = classname;
+ nmn->name = name;
+ nmn->descriptor = descriptor;
+ nmn->function = (functionptr) (ptrint) methods[i].fnPtr;
/* insert the method into the tree */
*******************************************************************************/
-static functionptr native_method_find(utf *name)
+static functionptr native_method_find(methodinfo *m)
{
native_methods_node_t tmpnmn;
native_methods_node_t *nmn;
- tmpnmn.name = name;
+ /* fill the temporary structure used for searching the tree */
+
+ tmpnmn.classname = m->class->name;
+ tmpnmn.name = m->name;
+ tmpnmn.descriptor = m->descriptor;
+
+ /* find the entry in the AVL-tree */
nmn = avl_find(tree_native_methods, &tmpnmn);
if (nmn == NULL)
return NULL;
- return nmn->method;
+ return nmn->function;
+}
+
+
+/* native_library_open *********************************************************
+
+ Open a native library with the given utf8 name.
+
+*******************************************************************************/
+
+#if !defined(WITH_STATIC_CLASSPATH)
+lt_dlhandle native_library_open(utf *filename)
+{
+ lt_dlhandle handle;
+
+ if (opt_verbosejni) {
+ printf("[Loading native library ");
+ utf_display_printable_ascii(filename);
+ printf(" ... ");
+ }
+
+ /* try to open the library */
+
+ handle = lt_dlopen(filename->text);
+
+ if (handle == NULL) {
+ if (opt_verbose) {
+ log_start();
+ log_print("native_library_load: lt_dlopen failed: ");
+ log_print(lt_dlerror());
+ log_finish();
+ }
+
+ return NULL;
+ }
+
+ return handle;
}
+#endif
-/* native_hashtable_library_add ************************************************
+/* native_library_add **********************************************************
Adds an entry to the native library hashtable.
*******************************************************************************/
#if !defined(WITH_STATIC_CLASSPATH)
-void native_hashtable_library_add(utf *filename, java_objectheader *loader,
- lt_dlhandle handle)
+void native_library_add(utf *filename, java_objectheader *loader,
+ lt_dlhandle handle)
{
hashtable_library_loader_entry *le;
hashtable_library_name_entry *ne; /* library name */
#endif /* !defined(WITH_STATIC_CLASSPATH) */
-/* native_hashtable_library_find ***********************************************
+/* native_library_find *********************************************************
Find an entry in the native library hashtable.
*******************************************************************************/
#if !defined(WITH_STATIC_CLASSPATH)
-hashtable_library_name_entry *native_hashtable_library_find(utf *filename,
- java_objectheader *loader)
+hashtable_library_name_entry *native_library_find(utf *filename,
+ java_objectheader *loader)
{
hashtable_library_loader_entry *le;
hashtable_library_name_entry *ne; /* library name */
/* no loader found? return NULL */
- if (!le)
+ if (le == NULL)
return NULL;
/* search for library name */
/* no function was found, throw exception */
- *exceptionptr =
- new_exception_utfmessage(string_java_lang_UnsatisfiedLinkError,
- mname);
+ exceptions_throw_unsatisfiedlinkerror(mname);
return NULL;
}
functionptr native_resolve_function(methodinfo *m)
{
+ java_objectheader *cl;
utf *name;
utf *newname;
functionptr f;
hashtable_library_name_entry *ne;
u4 key; /* hashkey */
u4 slot; /* slot in hashtable */
+#if defined(WITH_CLASSPATH_SUN)
+ methodinfo *method_findNative;
+ java_objectheader *s;
+#endif
+
+ cl = m->class->classloader;
/* verbose output */
/* normally addresses are aligned to 4, 8 or 16 bytes */
- key = ((u4) (ptrint) m->class->classloader) >> 4; /* align to 16-byte */
+ key = ((u4) (ptrint) cl) >> 4; /* align to 16-byte */
slot = key & (hashtable_library->size - 1);
le = hashtable_library->ptr[slot];
le = le->hashlink;
}
+#if defined(WITH_CLASSPATH_SUN)
+ if (f == NULL) {
+ /* We can resolve the function directly from
+ java.lang.ClassLoader as it's a static function. */
+ /* XXX should be done in native_init */
+
+ method_findNative =
+ class_resolveclassmethod(class_java_lang_ClassLoader,
+ utf_findNative,
+ utf_java_lang_ClassLoader_java_lang_String__J,
+ class_java_lang_ClassLoader,
+ true);
+
+ if (method_findNative == NULL)
+ return NULL;
+
+ /* try the normal name */
+
+ s = javastring_new(name);
+
+ f = (functionptr) (intptr_t) vm_call_method_long(method_findNative,
+ NULL, cl, s);
+
+ /* if not found, try the mangled name */
+
+ if (f == NULL) {
+ s = javastring_new(newname);
+
+ f = (functionptr) (intptr_t) vm_call_method_long(method_findNative,
+ NULL, cl, s);
+ }
+ }
+#endif
+
if (f != NULL)
if (opt_verbosejni)
printf("JNI ]\n");
main program. */
if (f == NULL) {
- f = native_method_find(name);
-
- if (f == NULL)
- f = native_method_find(newname);
+ f = native_method_find(m);
if (f != NULL)
if (opt_verbosejni)
/* find initializer */
- m = class_resolveclassmethod(c,
- utf_init,
- utf_java_lang_String__void,
- NULL,
- true);
+ m = class_findmethod(c, utf_init, utf_java_lang_String__void);
/* initializer not found */
}
-java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
-{
- methodinfo *m;
- java_objectheader *o;
-
- if (c == NULL)
- vm_abort("native_new_and_init_int: c == NULL");
-
- /* create object */
-
- o = builtin_new(c);
-
- if (o == NULL)
- return NULL;
-
- /* find initializer */
-
- m = class_resolveclassmethod(c, utf_init, utf_int__void, NULL, true);
-
- /* initializer not found */
-
- if (m == NULL)
- return NULL;
-
- /* call initializer */
-
- (void) vm_call_method(m, o, i);
-
- return o;
-}
-
-
-java_objectheader *native_new_and_init_throwable(classinfo *c, java_objectheader *t)
-{
- java_objectheader *o;
- methodinfo *m;
-
- if (c == NULL)
- vm_abort("native_new_and_init_throwable: c == NULL");
-
- /* create object */
-
- o = builtin_new(c);
-
- if (o == NULL)
- return NULL;
-
- /* find initializer */
-
- m = class_findmethod(c, utf_init, utf_java_lang_Throwable__void);
-
- /* initializer not found */
-
- if (m == NULL)
- return NULL;
-
- /* call initializer */
-
- (void) vm_call_method(m, o, t);
-
- return o;
-}
-
-
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where