| /* Copyright (C) 2001 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| package gnu.gcj.runtime; |
| import java.util.Hashtable; |
| |
| /** |
| * A ClassLoader backed by a gcj-compiled shared library. |
| * @author Per Bothner <per@bothner.com>, Brainfood Inc. |
| */ |
| |
| public class SharedLibLoader extends ClassLoader |
| { |
| public native void finalize (); |
| |
| /** Called during dlopen's processing of the init section. */ |
| void registerClass(String name, Class cls) |
| { |
| classMap.put(name, cls); |
| } |
| |
| /** Load a shared library, and associate a ClassLoader with it. |
| * @param libname named of shared library (passed to dlopen) |
| * @param parent the parent ClassLoader |
| * @parem flags passed to dlopen |
| */ |
| public SharedLibLoader(String libname, ClassLoader parent, int flags) |
| { |
| super(parent); |
| init(libname, flags); |
| } |
| |
| |
| /** Load a shared library, and asociate a ClassLoader with it. |
| * @param libname named of shared library (passed to dlopen) |
| */ |
| public SharedLibLoader(String libname) |
| { |
| super(getSystemClassLoader()); |
| init(libname, 0); |
| } |
| |
| void init(String libname, int flags) |
| { |
| init(libname.getBytes(), flags); |
| } |
| |
| native void init(byte[] libname, int flags); |
| |
| public Class loadClass(String name) |
| throws ClassNotFoundException |
| { |
| return super.loadClass(name); |
| } |
| |
| public Class findClass(String name) |
| throws ClassNotFoundException |
| { |
| Object cls = classMap.get(name); |
| if (cls == null) |
| throw new ClassNotFoundException(name); |
| return (Class) cls; |
| } |
| |
| /** The handle returned by dlopen. */ |
| gnu.gcj.RawData handler; |
| |
| /** Map classnames to Classes. */ |
| Hashtable classMap = new Hashtable(20); |
| } |