| // FirstThread.java - Implementation of very first thread. |
| |
| /* Copyright (C) 1998, 1999, 2000, 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.jar.*; |
| |
| /** |
| * @author Tom Tromey <tromey@cygnus.com> |
| * @date August 24, 1998 |
| */ |
| |
| final class FirstThread extends Thread |
| { |
| public FirstThread (Class k, String[] args) |
| { |
| super (null, null, "main"); |
| klass = k; |
| this.args = args; |
| } |
| |
| public FirstThread (String class_name, String[] args, boolean is_jar) |
| { |
| super (null, null, "main"); |
| klass_name = class_name; |
| this.args = args; |
| this.is_jar = is_jar; |
| } |
| |
| public void run() |
| { |
| if (is_jar) |
| klass_name = getMain(klass_name); |
| |
| if (klass == null) |
| { |
| try |
| { |
| klass = Class.forName(klass_name); |
| } |
| catch (ClassNotFoundException x) |
| { |
| throw new NoClassDefFoundError(klass_name); |
| } |
| } |
| |
| call_main(); |
| } |
| |
| private String getMain (String name) |
| { |
| String mainName = null; |
| try { |
| |
| JarFile j = new JarFile (name); |
| |
| Attributes a = j.getManifest().getMainAttributes(); |
| |
| mainName = a.getValue(Attributes.Name.MAIN_CLASS); |
| |
| } catch (Exception e) { |
| // empty |
| } |
| |
| if (mainName == null) |
| { |
| System.err.println ("Failed to load Main-Class manifest attribute from\n" |
| + name); |
| System.exit(1); |
| } |
| return mainName; |
| } |
| |
| private native void call_main (); |
| |
| // Private data. |
| private Class klass; |
| private String klass_name; |
| private Object args; |
| private boolean is_jar; |
| |
| // If the user links statically then we need to ensure that these |
| // classes are linked in. Otherwise bootstrapping fails. These |
| // classes are only referred to via Class.forName(), so we add an |
| // explicit mention of them here. |
| static final Class Kcert = java.security.cert.Certificate.class; |
| static final Class Kfile = gnu.gcj.protocol.file.Handler.class; |
| static final Class Khttp = gnu.gcj.protocol.http.Handler.class; |
| static final Class Kjar = gnu.gcj.protocol.jar.Handler.class; |
| } |