
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_lang_System__
#define __java_lang_System__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace nio
    {
      namespace channels
      {
          class Channel;
      }
    }
  }
}

class java::lang::System : public ::java::lang::Object
{

  System();
public:
  static void setIn(::java::io::InputStream *);
  static void setOut(::java::io::PrintStream *);
  static void setErr(::java::io::PrintStream *);
  static void setSecurityManager(::java::lang::SecurityManager *);
  static ::java::lang::SecurityManager * getSecurityManager();
  static jlong currentTimeMillis();
  static jlong nanoTime();
  static void arraycopy(::java::lang::Object *, jint, ::java::lang::Object *, jint, jint);
  static jint identityHashCode(::java::lang::Object *);
  static ::java::util::Properties * getProperties();
  static void setProperties(::java::util::Properties *);
  static ::java::lang::String * getProperty(::java::lang::String *);
  static ::java::lang::String * getProperty(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * setProperty(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * clearProperty(::java::lang::String *);
  static ::java::lang::String * getenv(::java::lang::String *);
  static ::java::util::Map * getenv();
  static void exit(jint);
  static void gc();
  static void runFinalization();
  static void runFinalizersOnExit(jboolean);
  static void load(::java::lang::String *);
  static void loadLibrary(::java::lang::String *);
  static ::java::lang::String * mapLibraryName(::java::lang::String *);
private:
  static void setIn0(::java::io::InputStream *);
  static void setOut0(::java::io::PrintStream *);
  static void setErr0(::java::io::PrintStream *);
public: // actually package-private
  static ::java::lang::String * getenv0(::java::lang::String *);
public:
  static ::java::nio::channels::Channel * inheritedChannel();
  static ::java::io::InputStream * in;
  static ::java::io::PrintStream * out;
  static ::java::io::PrintStream * err;
private:
  static ::java::util::Map * environmentMap;
public:
  static ::java::lang::Class class$;
};

#endif // __java_lang_System__
