\input texinfo @c -*-texinfo-*-
@setfilename gcj.info
@settitle Guide to GNU gcj

@c Merge the standard indexes into a single one.
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
@syncodeindex pg cp
@syncodeindex tp cp

@include gcc-common.texi

@c Note: When reading this manual you'll find lots of strange
@c circumlocutions like ``compiler for the Java language''.
@c This is necessary due to Sun's restrictions on the use of
@c the word ``Java'.

@c When this manual is copyrighted.
@set copyrights-gcj 2001, 2002, 2003, 2004, 2005

@c Versions
@set which-gcj GCC-@value{version-GCC}

@copying
@c man begin COPYRIGHT
Copyright @copyright{} @value{copyrights-gcj} Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``GNU General Public License'', the Front-Cover
texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the
@c man end
section entitled
``GNU Free Documentation License''.
@ignore
@c man begin COPYRIGHT
man page gfdl(7).
@c man end
@end ignore

@c man begin COPYRIGHT

(a) The FSF's Front-Cover Text is:

     A GNU Manual

(b) The FSF's Back-Cover Text is:

     You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development.
@c man end
@end copying

@ifinfo
@format
@dircategory Software development
@direntry
* Gcj: (gcj).               Ahead-of-time compiler for the Java language
@end direntry

@dircategory Individual utilities
@direntry
* gcjh: (gcj)Invoking gcjh.
                            Generate header files from Java class files
* gjnih: (gcj)Invoking gjnih.
                            Generate JNI header files from Java class files
* jv-scan: (gcj)Invoking jv-scan.
                            Print information about Java source files
* jcf-dump: (gcj)Invoking jcf-dump.
                            Print information about Java class files
* gij: (gcj)Invoking gij.   GNU interpreter for Java bytecode
* gcj-dbtool: (gcj)Invoking gcj-dbtool.
                            Tool for manipulating class file databases.
* jv-convert: (gcj)Invoking jv-convert.
                            Convert file from one encoding to another
* grmic: (gcj)Invoking grmic.
                            Generate stubs for Remote Method Invocation.
* grmiregistry: (gcj)Invoking grmiregistry.
                            The remote object registry.
@end direntry
@end format

@insertcopying
@end ifinfo

@titlepage
@title GNU gcj
@versionsubtitle
@author Tom Tromey

@page
@vskip 0pt plus 1filll
Published by the Free Software Foundation @*
51 Franklin Street, Fifth Floor@*
Boston, MA 02110-1301, USA@*
@sp 1
@insertcopying
@end titlepage
@contents
@page


@node Top
@top Introduction

This manual describes how to use @command{gcj}, the GNU compiler for the
Java programming language.  @command{gcj} can generate both @file{.class}
files and object files, and it can read both Java source code and
@file{.class} files.

@menu
* Copying::		 The GNU General Public License
* GNU Free Documentation License::
			How you can share and copy this manual
* Invoking gcj::	Compiler options supported by @command{gcj}
* Compatibility::	Compatibility between gcj and other tools for Java
* Invoking gcjh::       Generate header files from class files
* Invoking gjnih::      Generate JNI header files from class files
* Invoking jv-scan::    Print information about source files
* Invoking jcf-dump::   Print information about class files
* Invoking gij::	Interpreting Java bytecodes
* Invoking gcj-dbtool:: Tool for manipulating class file databases.
* Invoking jv-convert:: Converting from one encoding to another
* Invoking grmic::      Generate stubs for Remote Method Invocation.
* Invoking grmiregistry:: The remote object registry.
* About CNI::           Description of the Compiled Native Interface
* System properties::   Modifying runtime behavior of the libgcj library
* Resources::		Where to look for more information
* Index::               Index.
@end menu


@include gpl.texi

@include fdl.texi


@node Invoking gcj
@chapter Invoking gcj

@c man title gcj Ahead-of-time compiler for the Java language

@ignore
@c man begin SYNOPSIS gcj
gcj [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
    [@option{--CLASSPATH}=@var{path}] [@option{--classpath}=@var{path}]
    [@option{-f}@var{option}@dots{}] [@option{--encoding}=@var{name}]
    [@option{--main}=@var{classname}] [@option{-D}@var{name}[=@var{value}]@dots{}]
    [@option{-C}] [@option{--resource} @var{resource-name}] [@option{-d} @var{directory}]
    [@option{-W}@var{warn}@dots{}]
    @var{sourcefile}@dots{}
@c man end
@c man begin SEEALSO gcj
gcc(1), gcjh(1), gjnih(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin DESCRIPTION gcj

As @command{gcj} is just another front end to @command{gcc}, it supports many
of the same options as gcc.  @xref{Option Summary, , Option Summary,
gcc, Using the GNU Compiler Collection (GCC)}.  This manual only documents the
options specific to @command{gcj}.

@c man end

@menu
* Input and output files::
* Input Options::		How gcj finds files
* Encodings::                   Options controlling source file encoding
* Warnings::			Options controlling warnings specific to gcj
* Linking::			Options for making an executable
* Code Generation::		Options controlling the output of gcj
* Configure-time Options::	Options you won't use
@end menu

@c man begin OPTIONS gcj

@node Input and output files
@section Input and output files

A @command{gcj} command is like a @command{gcc} command, in that it
consists of a number of options and file names.  The following kinds
of input file names are supported:

@table @gcctabopt
@item @var{file}.java
Java source files.
@item @var{file}.class
Java bytecode files.
@item @var{file}.zip
@itemx @var{file}.jar
An archive containing one or more @code{.class} files, all of
which are compiled.  The archive may be compressed.  Files in
an archive which don't end with @samp{.class} are treated as
resource files; they are compiled into the resulting object file
as @samp{core:} URLs.
@item @@@var{file}
A file containing a whitespace-separated list of input file names.
(Currently, these must all be @code{.java} source files, but that
may change.)
Each named file is compiled, just as if it had been on the command line.
@item @var{library}.a
@itemx @var{library}.so
@itemx -l@var{libname}
Libraries to use when linking.  See the @command{gcc} manual.
@end table

You can specify more than one input file on the @command{gcj} command line,
in which case they will all be compiled.  If you specify a
@code{-o @var{FILENAME}}
option, all the input files will be compiled together, producing a
single output file, named @var{FILENAME}.
This is allowed even when using @code{-S} or @code{-c},
but not when using @code{-C} or @code{--resource}.
(This is an extension beyond the what plain @command{gcc} allows.)
(If more than one input file is specified, all must currently
be @code{.java} files, though we hope to fix this.)

@node Input Options
@section Input Options

@cindex class path

@command{gcj} has options to control where it looks to find files it needs.
For instance, @command{gcj} might need to load a class that is referenced
by the file it has been asked to compile.  Like other compilers for the
Java language, @command{gcj} has a notion of a @dfn{class path}.  There are
several options and environment variables which can be used to
manipulate the class path.  When @command{gcj} looks for a given class, it
searches the class path looking for matching @file{.class} or
@file{.java} file.  @command{gcj} comes with a built-in class path which
points at the installed @file{libgcj.jar}, a file which contains all the
standard classes.

In the below, a directory or path component can refer either to an
actual directory on the filesystem, or to a @file{.zip} or @file{.jar}
file, which @command{gcj} will search as if it is a directory.

@table @gcctabopt
@item -I@var{dir}
All directories specified by @code{-I} are kept in order and prepended
to the class path constructed from all the other options.  Unless
compatibility with tools like @code{javac} is important, we recommend
always using @code{-I} instead of the other options for manipulating the
class path.

@item --classpath=@var{path}
This sets the class path to @var{path}, a colon-separated list of paths
(on Windows-based systems, a semicolon-separate list of paths).
This does not override the builtin (``boot'') search path.

@item --CLASSPATH=@var{path}
Deprecated synonym for @code{--classpath}.

@item --bootclasspath=@var{path}
Where to find the standard builtin classes, such as @code{java.lang.String}.

@item --extdirs=@var{path}
For each directory in the @var{path}, place the contents of that
directory at the end of the class path.

@item CLASSPATH
This is an environment variable which holds a list of paths.
@end table

The final class path is constructed like so:

@itemize @bullet
@item
First come all directories specified via @code{-I}.

@item
If @option{--classpath} is specified, its value is appended.
Otherwise, if the @code{CLASSPATH} environment variable is specified,
then its value is appended.
Otherwise, the current directory (@code{"."}) is appended.

@item
If @code{--bootclasspath} was specified, append its value.
Otherwise, append the built-in system directory, @file{libgcj.jar}.

@item
Finally, if @code{--extdirs} was specified, append the contents of the
specified directories at the end of the class path.  Otherwise, append
the contents of the built-in extdirs at @code{$(prefix)/share/java/ext}.
@end itemize

The classfile built by @command{gcj} for the class @code{java.lang.Object}
(and placed in @code{libgcj.jar}) contains a special zero length
attribute @code{gnu.gcj.gcj-compiled}. The compiler looks for this
attribute when loading @code{java.lang.Object} and will report an error
if it isn't found, unless it compiles to bytecode (the option
@code{-fforce-classes-archive-check} can be used to override this
behavior in this particular case.)

@table @gcctabopt
@item -fforce-classes-archive-check
This forces the compiler to always check for the special zero length
attribute @code{gnu.gcj.gcj-compiled} in @code{java.lang.Object} and
issue an error if it isn't found.
@end table

@node Encodings
@section Encodings

The Java programming language uses Unicode throughout.  In an effort to
integrate well with other locales, @command{gcj} allows @file{.java} files
to be written using almost any encoding.  @command{gcj} knows how to
convert these encodings into its internal encoding at compile time.

You can use the @code{--encoding=@var{NAME}} option to specify an
encoding (of a particular character set) to use for source files.  If
this is not specified, the default encoding comes from your current
locale.  If your host system has insufficient locale support, then
@command{gcj} assumes the default encoding to be the @samp{UTF-8} encoding
of Unicode.

To implement @code{--encoding}, @command{gcj} simply uses the host
platform's @code{iconv} conversion routine.  This means that in practice
@command{gcj} is limited by the capabilities of the host platform.

The names allowed for the argument @code{--encoding} vary from platform
to platform (since they are not standardized anywhere).  However,
@command{gcj} implements the encoding named @samp{UTF-8} internally, so if
you choose to use this for your source files you can be assured that it
will work on every host.


@node Warnings
@section Warnings

@command{gcj} implements several warnings.  As with other generic
@command{gcc} warnings, if an option of the form @code{-Wfoo} enables a
warning, then @code{-Wno-foo} will disable it.  Here we've chosen to
document the form of the warning which will have an effect -- the
default being the opposite of what is listed.

@table @gcctabopt
@item -Wredundant-modifiers
With this flag, @command{gcj} will warn about redundant modifiers.  For
instance, it will warn if an interface method is declared @code{public}.

@item -Wextraneous-semicolon
This causes @command{gcj} to warn about empty statements.  Empty statements
have been deprecated.

@item -Wno-out-of-date
This option will cause @command{gcj} not to warn when a source file is
newer than its matching class file.  By default @command{gcj} will warn
about this.

@item -Wno-deprecated
Warn if a deprecated class, method, or field is referred to.

@item -Wunused
This is the same as @command{gcc}'s @code{-Wunused}.

@item -Wall
This is the same as @code{-Wredundant-modifiers -Wextraneous-semicolon
-Wunused}.
@end table


@node Linking
@section Linking

To turn a Java application into an executable program,
you need to link it with the needed libraries, just as for C or C++.
The linker by default looks for a global function named @code{main}.
Since Java does not have global functions, and a
collection of Java classes may have more than one class with a
@code{main} method, you need to let the linker know which of those
@code{main} methods it should invoke when starting the application.
You can do that in any of these ways:

@itemize @bullet
@item
Specify the class containing the desired @code{main} method
when you link the application, using the @code{--main} flag,
described below.
@item
Link the Java package(s) into a shared library (dll) rather than an
executable.  Then invoke the application using the @code{gij} program,
making sure that @code{gij} can find the libraries it needs.
@item
Link the Java packages(s) with the flag @code{-lgij}, which links
in the @code{main} routine from the @code{gij} command.
This allows you to select the class whose @code{main} method you
want to run when you run the application.  You can also use
other @code{gij} flags, such as @code{-D} flags to set properties.
Using the @code{-lgij} library (rather than the @code{gij} program
of the previous mechanism) has some advantages: it is compatible with
static linking, and does not require configuring or installing libraries.
@end itemize

These @code{gij} options relate to linking an executable:

@table @gcctabopt
@item --main=@var{CLASSNAME}
This option is used when linking to specify the name of the class whose
@code{main} method should be invoked when the resulting executable is
run.

@item -D@var{name}[=@var{value}]
This option can only be used with @code{--main}.  It defines a system
property named @var{name} with value @var{value}.  If @var{value} is not
specified then it defaults to the empty string.  These system properties
are initialized at the program's startup and can be retrieved at runtime
using the @code{java.lang.System.getProperty} method.

@item -lgij
Create an application whose command-line processing is that
of the @code{gij} command.

This option is an alternative to using @code{--main}; you cannot use both.

@item -static-libgcj
This option causes linking to be done against a static version of the
libgcj runtime library.  This option is only available if
corresponding linker support exists.

@strong{Caution:} Static linking of libgcj may cause essential parts
of libgcj to be omitted.  Some parts of libgcj use reflection to load
classes at runtime.  Since the linker does not see these references at
link time, it can omit the referred to classes.  The result is usually
(but not always) a @code{ClassNotFoundException} being thrown at
runtime. Caution must be used when using this option.  For more
details see:
@w{@uref{http://gcc.gnu.org/wiki/Statically%20linking%20libgcj}}
@end table

@node Code Generation
@section Code Generation

In addition to the many @command{gcc} options controlling code generation,
@command{gcj} has several options specific to itself.

@table @gcctabopt

@item -C
This option is used to tell @command{gcj} to generate bytecode
(@file{.class} files) rather than object code.

@item --resource @var{resource-name}
This option is used to tell @command{gcj} to compile the contents of a
given file to object code so it may be accessed at runtime with the core
protocol handler as @samp{core:/@var{resource-name}}.  Note that
@var{resource-name} is the name of the resource as found at runtime; for
instance, it could be used in a call to @code{ResourceBundle.getBundle}.
The actual file name to be compiled this way must be specified
separately.

@item -d @var{directory}
When used with @code{-C}, this causes all generated @file{.class} files
to be put in the appropriate subdirectory of @var{directory}.  By
default they will be put in subdirectories of the current working
directory.

@item -fno-bounds-check
By default, @command{gcj} generates code which checks the bounds of all
array indexing operations.  With this option, these checks are omitted, which
can improve performance for code that uses arrays extensively.  Note that this 
can result in unpredictable behavior if the code in question actually does 
violate array bounds constraints.  It is safe to use this option if you are 
sure that your code will never throw an @code{ArrayIndexOutOfBoundsException}.

@item -fno-store-check
Don't generate array store checks.  When storing objects into arrays, a runtime
check is normally generated in order to ensure that the object is assignment
compatible with the component type of the array (which may not be known
at compile-time).  With this option, these checks are omitted.  This can 
improve performance for code which stores objects into arrays frequently.
It is safe to use this option if you are sure your code will never throw an 
@code{ArrayStoreException}.

@item -fjni
With @command{gcj} there are two options for writing native methods: CNI
and JNI@.  By default @command{gcj} assumes you are using CNI@.  If you are
compiling a class with native methods, and these methods are implemented
using JNI, then you must use @code{-fjni}.  This option causes
@command{gcj} to generate stubs which will invoke the underlying JNI
methods.

@item -fno-assert
Don't recognize the @code{assert} keyword.  This is for compatibility
with older versions of the language specification.

@item -fno-optimize-static-class-initialization
When the optimization level is greater or equal to @code{-O2},
@command{gcj} will try to optimize the way calls into the runtime are made
to initialize static classes upon their first use (this optimization
isn't carried out if @code{-C} was specified.) When compiling to native
code, @code{-fno-optimize-static-class-initialization} will turn this
optimization off, regardless of the optimization level in use.

@item --disable-assertions[=@var{class-or-package}]
Don't include code for checking assertions in the compiled code.
If @code{=@var{class-or-package}} is missing disables assertion code
generation for all classes, unless overridden by a more
specific @code{--enable-assertions} flag.
If @var{class-or-package} is a class name, only disables generating
assertion checks within the named class or its inner classes.
If @var{class-or-package} is a package name, disables generating
assertion checks within the named package or a subpackage.

By default, assertions are enabled when generating class files
or when not optimizing, and disabled when generating optimized binaries.

@item --enable-assertions[=@var{class-or-package}]
Generates code to check assertions.  The option is perhaps misnamed,
as you still need to turn on assertion checking at run-time,
and we don't support any easy way to do that.
So this flag isn't very useful yet, except to partially override
@code{--disable-assertions}.

@item -findirect-dispatch
@command{gcj} has a special binary compatibility ABI, which is enabled
by the @code{-findirect-dispatch} option.  In this mode, the code
generated by @command{gcj} honors the binary compatibility guarantees
in the Java Language Specification, and the resulting object files do
not need to be directly linked against their dependencies.  Instead,
all dependencies are looked up at runtime.  This allows free mixing of
interpreted and compiled code.

Note that, at present, @code{-findirect-dispatch} can only be used
when compiling @file{.class} files.  It will not work when compiling
from source.  CNI also does not yet work with the binary compatibility
ABI.  These restrictions will be lifted in some future release.

However, if you compile CNI code with the standard ABI, you can call
it from code built with the binary compatibility ABI.

@item -fbootstrap-classes
This option can be use to tell @code{libgcj} that the compiled classes
should be loaded by the bootstrap loader, not the system class loader.
By default, if you compile a class and link it into an executable, it
will be treated as if it was loaded using the system class loader.
This is convenient, as it means that things like
@code{Class.forName()} will search @samp{CLASSPATH} to find the
desired class.

@item -freduced-reflection
This option causes the code generated by @command{gcj} to contain a
reduced amount of the class meta-data used to support runtime
reflection. The cost of this savings is the loss of
the ability to use certain reflection capabilities of the standard
Java runtime environment. When set all meta-data except for that
which is needed to obtain correct runtime semantics is eliminated.

For code that does not use reflection (i.e. the methods in the
@code{java.lang.reflect} package), @code{-freduced-reflection}
will result in proper operation with a savings in executable code size.

JNI (@code{-fjni}) and the binary compatibility ABI
(@code{-findirect-dispatch}) do not work properly without full
reflection meta-data.  Because of this, it is an error to use these options
with @code{-freduced-reflection}.

@strong{Caution:} If there is no reflection meta-data, code that uses
a @code{SecurityManager} may not work properly.  Also calling
@code{Class.forName()} may fail if the calling method has no
reflection meta-data.

@end table


@node Configure-time Options
@section Configure-time Options

Some @command{gcj} code generations options affect the resulting ABI, and
so can only be meaningfully given when @code{libgcj}, the runtime
package, is configured.  @code{libgcj} puts the appropriate options from
this group into a @samp{spec} file which is read by @command{gcj}.  These
options are listed here for completeness; if you are using @code{libgcj}
then you won't want to touch these options.

@table @gcctabopt
@item -fuse-boehm-gc
This enables the use of the Boehm GC bitmap marking code.  In particular
this causes @command{gcj} to put an object marking descriptor into each
vtable.

@item -fhash-synchronization
By default, synchronization data (the data used for @code{synchronize},
@code{wait}, and @code{notify}) is pointed to by a word in each object.
With this option @command{gcj} assumes that this information is stored in a
hash table and not in the object itself.

@item -fuse-divide-subroutine
On some systems, a library routine is called to perform integer
division.  This is required to get exception handling correct when
dividing by zero.

@item -fcheck-references
On some systems it's necessary to insert inline checks whenever
accessing an object via a reference.  On other systems you won't need
this because null pointer accesses are caught automatically by the
processor.
@end table

@c man end

@node Compatibility
@chapter Compatibility with the Java Platform

As we believe it is important that the Java platform not be fragmented,
@command{gcj} and @code{libgcj} try to conform to the relevant Java
specifications.  However, limited manpower and incomplete and unclear
documentation work against us.  So, there are caveats to using
@command{gcj}.

@menu
* Limitations::                 
* Extensions::                  
@end menu

@node Limitations
@section Standard features not yet supported

This list of compatibility issues is by no means complete.

@itemize @bullet
@item
@command{gcj} implements the JDK 1.2 language.  It supports inner classes
and the new 1.4 @code{assert} keyword.  It does not yet support the Java 2
@code{strictfp} keyword (it recognizes the keyword but ignores it).  

@item
@code{libgcj} is largely compatible with the JDK 1.2 libraries.
However, @code{libgcj} is missing many packages, most notably
@code{java.awt}.  There are also individual missing classes and methods.
We currently do not have a list showing differences between
@code{libgcj} and the Java 2 platform.

@item
Sometimes the @code{libgcj} implementation of a method or class differs
from the JDK implementation.  This is not always a bug.  Still, if it
affects you, it probably makes sense to report it so that we can discuss
the appropriate response.

@item
@command{gcj} does not currently allow for piecemeal replacement of
components within @code{libgcj}. Unfortunately, programmers often want
to use newer versions of certain packages, such as those provided by
the Apache Software Foundation's Jakarta project.  This has forced us
to place the @code{org.w3c.dom} and @code{org.xml.sax} packages into
their own libraries, separate from @code{libgcj}.  If you intend to
use these classes, you must link them explicitly with
@code{-l-org-w3c-dom} and @code{-l-org-xml-sax}.  Future versions of
@command{gcj} may not have this restriction.
@end itemize

@node Extensions
@section Extra features unique to gcj

The main feature of @command{gcj} is that it can compile programs written in
the Java programming language to native code.  Most extensions that have been
added are to facilitate this functionality.

@itemize @bullet
@item
@command{gcj} makes it easy and efficient to mix code written in Java and C++.
@xref{About CNI}, for more info on how to use this in your programs.

@item
When you compile your classes into a shared library using
@code{-findirect-dispatch} then add them to the system-wide
classmap.db file using @code{gcj-dbtool}, they will be automatically
loaded by the @code{libgcj} system classloader.  This is the new,
preferred classname-to-library resolution mechanism.  @xref{Invoking
gcj-dbtool}, for more information on using the classmap database.

@item
The old classname-to-library lookup mechanism is still supported
through the @code{gnu.gcj.runtime.VMClassLoader.library_control}
property, but it is deprecated and will likely be removed in some
future release.  When trying to load a class @code{gnu.pkg.SomeClass}
the system classloader will first try to load the shared library
@file{lib-gnu-pkg-SomeClass.so}, if that fails to load the class then
it will try to load @file{lib-gnu-pkg.so} and finally when the class
is still not loaded it will try to load @file{lib-gnu.so}.  Note that
all @samp{.}s will be transformed into @samp{-}s and that searching
for inner classes starts with their outermost outer class.  If the
class cannot be found this way the system classloader tries to use the
@code{libgcj} bytecode interpreter to load the class from the standard
classpath.  This process can be controlled to some degree via the
@code{gnu.gcj.runtime.VMClassLoader.library_control} property;
@xref{libgcj Runtime Properties}.

@item
@code{libgcj} includes a special @samp{gcjlib} URL type.  A URL of
this form is like a @code{jar} URL, and looks like
@samp{gcjlib:/path/to/shared/library.so!/path/to/resource}.  An access
to one of these URLs causes the shared library to be @code{dlopen()}d,
and then the resource is looked for in that library.  These URLs are
most useful when used in conjunction with @code{java.net.URLClassLoader}.
Note that, due to implementation limitations, currently any such URL
can be accessed by only one class loader, and libraries are never
unloaded.  This means some care must be exercised to make sure that
a @code{gcjlib} URL is not accessed by more than one class loader at once.
In a future release this limitation will be lifted, and such
libraries will be mapped privately.

@item
A program compiled by @command{gcj} will examine the
@env{GCJ_PROPERTIES} environment variable and change its behavior in
some ways.  In particular @env{GCJ_PROPERTIES} holds a list of
assignments to global properties, such as would be set with the
@option{-D} option to @command{java}.  For instance,
@samp{java.compiler=gcj} is a valid (but currently meaningless)
setting.
@cindex GCJ_PROPERTIES
@vindex GCJ_PROPERTIES

@end itemize


@node Invoking gcjh
@chapter Invoking gcjh

@c man title gcjh generate header files from Java class files

@c man begin DESCRIPTION gcjh

The @code{gcjh} program is used to generate header files from class
files.  It can generate both CNI and JNI header files, as well as stub
implementation files which can be used as a basis for implementing the
required native methods.

@c man end

@ignore
@c man begin SYNOPSIS gcjh
gcjh [@option{-stubs}] [@option{-jni}]
    [@option{-force}] [@option{-old}] [@option{-trace}] [@option{-J} @var{option}]
    [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}]
    [@option{-preprend} @var{text}]
    [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
    [@option{--bootclasspath}=@var{path}]
    [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
    [@option{-o} @var{file}] [@option{-td} @var{dir}]
    [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}]
    [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
    @var{classname}@dots{}
@c man end
@c man begin SEEALSO gcjh
gcc(1), gcj(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin OPTIONS gcjh

@table @gcctabopt
@item -stubs
This causes @code{gcjh} to generate stub files instead of header files.
By default the stub file will be named after the class, with a suffix of
@samp{.cc}.  In JNI mode, the default output file will have the suffix
@samp{.c}.

@item -jni
This tells @code{gcjh} to generate a JNI header or stub.  By default,
CNI headers are generated.

@item -force
This option forces @code{gcjh} to write the output file.

@item -old
This option is accepted but ignored for compatibility.

@item -trace
This option is accepted but ignored for compatibility.

@item -J @var{option}
This option is accepted but ignored for compatibility.

@item -add @var{text}
Inserts @var{text} into the class body.  This is ignored in JNI mode.

@item -append @var{text}
Inserts @var{text} into the header file after the class declaration.
This is ignored in JNI mode.

@item -friend @var{text}
Inserts @var{text} into the class as a @code{friend} declaration.
This is ignored in JNI mode.

@item -prepend @var{text}
Inserts @var{text} into the header file before the class declaration.
This is ignored in JNI mode.

@item --classpath=@var{path}
@itemx --CLASSPATH=@var{path}
@itemx --bootclasspath=@var{path}
@itemx -I@var{directory}
@itemx -d @var{directory}
@itemx -o @var{file}
These options are all identical to the corresponding @command{gcj} options.

@item -o @var{file}
Sets the output file name.  This cannot be used if there is more than
one class on the command line.

@item -td @var{directory}
Sets the name of the directory to use for temporary files.

@item -M
Print all dependencies to stdout; suppress ordinary output.

@item -MM
Print non-system dependencies to stdout; suppress ordinary output.

@item -MD
Print all dependencies to stdout.

@item -MMD
Print non-system dependencies to stdout.

@item --help
Print help about @code{gcjh} and exit.  No further processing is done.

@item --version
Print version information for @code{gcjh} and exit.  No further
processing is done.

@item -v, --verbose
Print extra information while running.
@end table

All remaining options are considered to be names of classes.

@c man end

@node Invoking gjnih
@chapter Invoking gjnih

@c man title gjnih generate JNI header files from Java class files

@c man begin DESCRIPTION gjnih

The @code{gjnih} program is used to generate JNI header files from class
files.  Running it is equivalent to running @code{gcjh -jni}.

@c man end

@ignore
@c man begin SYNOPSIS gjnih
gjnih [@option{-stubs}] [@option{-jni}]
    [@option{-force}] [@option{-old}] [@option{-trace}] [@option{-J} @var{option}]
    [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}]
    [@option{-preprend} @var{text}]
    [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
    [@option{--bootclasspath}=@var{path}]
    [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
    [@option{-o} @var{file}] [@option{-td} @var{dir}]
    [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}]
    [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
    @var{classname}@dots{}
@c man end
@c man begin SEEALSO gjnih
gcc(1), gcj(1), gcjh(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin OPTIONS gjnih

@table @gcctabopt
@item -stubs
This causes @code{gjnih} to generate stub files instead of header files.
By default the stub file will be named after the class, with a suffix of
@samp{.c}.

@item -jni
This option specifies the default behavior which is to generate a JNI
header or stub.

@item -force
This option forces @code{gjnih} to write the output file.

@item -old
This option is accepted but ignored for compatibility.

@item -trace
This option is accepted but ignored for compatibility.

@item -J @var{option}
This option is accepted but ignored for compatibility.

@item -add @var{text}
Inserts @var{text} into the class body.  This is ignored in by
@code{gjnih}.

@item -append @var{text}
Inserts @var{text} into the header file after the class declaration.
This is ignored in by @code{gjnih}.

@item -friend @var{text}
Inserts @var{text} into the class as a @code{friend} declaration.
This is ignored by @code{gjnih}.

@item -prepend @var{text}
Inserts @var{text} into the header file before the class declaration.
This is ignored in by @code{gjnih}.

@item --classpath=@var{path}
@itemx --CLASSPATH=@var{path}
@itemx --bootclasspath=@var{path}
@itemx -I@var{directory}
@itemx -d @var{directory}
@itemx -o @var{file}
These options are all identical to the corresponding @command{gcj} options.

@item -o @var{file}
Sets the output file name.  This cannot be used if there is more than
one class on the command line.

@item -td @var{directory}
Sets the name of the directory to use for temporary files.

@item -M
Print all dependencies to stdout; suppress ordinary output.

@item -MM
Print non-system dependencies to stdout; suppress ordinary output.

@item -MD
Print all dependencies to stdout.

@item -MMD
Print non-system dependencies to stdout.

@item --help
Print help about @code{gjnih} and exit.  No further processing is done.

@item --version
Print version information for @code{gjnih} and exit.  No further
processing is done.

@item -v, --verbose
Print extra information while running.
@end table

All remaining options are considered to be names of classes.

@c man end

@node Invoking jv-scan
@chapter Invoking jv-scan

@c man title jv-scan print information about Java source file

@c man begin DESCRIPTION jv-scan

The @code{jv-scan} program can be used to print information about a Java
source file (@file{.java} file).

@c man end

@ignore
@c man begin SYNOPSIS jv-scan
jv-scan [@option{--no-assert}] [@option{--complexity}] 
    [@option{--encoding}=@var{name}] [@option{--print-main}] 
    [@option{--list-class}] [@option{--list-filename}]
    [@option{--version}] [@option{--help}]
    [@option{-o} @var{file}] @var{inputfile}@dots{}
@c man end
@c man begin SEEALSO jv-scan
gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin OPTIONS jv-scan

@table @gcctabopt
@item --no-assert
Don't recognize the @code{assert} keyword, for backwards compatibility
with older versions of the language specification.

@item --complexity
This prints a complexity measure, related to cyclomatic complexity, for
each input file.

@item --encoding=@var{name}
This works like the corresponding @command{gcj} option.

@item --print-main
This prints the name of the class in this file containing a @code{main}
method.

@item --list-class
This lists the names of all classes defined in the input files.

@item --list-filename
If @code{--list-class} is given, this option causes @code{jv-scan} to
also print the name of the file in which each class was found.

@item -o @var{file}
Print output to the named file.

@item --help
Print help, then exit.

@item --version
Print version number, then exit.
@end table

@c man end

@node Invoking jcf-dump
@chapter Invoking jcf-dump

@c man title jcf-dump print information about Java class files

@ignore
@c man begin SYNOPSIS jcf-dump
jcf-dump [@option{-c}] [@option{--javap}]
    [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
    [@option{-I}@var{dir}@dots{}] [@option{-o} @var{file}]
    [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
    @var{classname}@dots{}
@c man end
@c man begin SEEALSO jcf-dump
gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin DESCRIPTION jcf-dump

This is a class file examiner, similar to @code{javap}.  It will print
information about a number of classes, which are specified by class name
or file name.

@c man end

@c man begin OPTIONS jcf-dump

@table @gcctabopt
@item -c
Disassemble method bodies.  By default method bodies are not printed.

@item --print-constants
Print the constant pool.  When printing a reference to a constant
also print its index in the constant pool.

@item --javap
Generate output in @code{javap} format.  The implementation of this
feature is very incomplete.

@item --classpath=@var{path}
@itemx --CLASSPATH=@var{path}
@itemx -I@var{directory}
@itemx -o @var{file}
These options as the same as the corresponding @command{gcj} options.

@item --help
Print help, then exit.

@item --version
Print version number, then exit.

@item -v, --verbose
Print extra information while running.
Implies @code{--print-constants}.
@end table

@c man end

@node Invoking gij
@chapter Invoking gij

@c man title gij GNU interpreter for Java bytecode

@ignore
@c man begin SYNOPSIS gij
gij [@option{OPTION}] @dots{} @var{JARFILE} [@var{ARGS}@dots{}]

gij [@option{-jar}] [@option{OPTION}] @dots{} @var{CLASS} [@var{ARGS}@dots{}]
  [@option{-cp} @var{path}] [@option{-classpath} @var{path}]
  [@option{-D}@var{name}[=@var{value}]@dots{}]
  [@option{-ms=}@var{number}] [@option{-mx=}@var{number}]
  [@option{-X@var{argument}}] [@option{-verbose}] [@option{-verbose:class}]
  [@option{--showversion}] [@option{--version}] [@option{--help}][@option{-?}]
@c man end
@c man begin SEEALSO gij
gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin DESCRIPTION gij

@code{gij} is a Java bytecode interpreter included with @code{libgcj}.
@code{gij} is not available on every platform; porting it requires a
small amount of assembly programming which has not been done for all the
targets supported by @command{gcj}.

The primary argument to @code{gij} is the name of a class or, with
@code{-jar}, a jar file.  Options before this argument are interpreted
by @code{gij}; remaining options are passed to the interpreted program.

If a class name is specified and this class does not have a @code{main}
method with the appropriate signature (a @code{static void} method with
a @code{String[]} as its sole argument), then @code{gij} will print an
error and exit.

If a jar file is specified then @code{gij} will use information in it to
determine which class' @code{main} method will be invoked.

@code{gij} will invoke the @code{main} method with all the remaining
command-line options.

Note that @code{gij} is not limited to interpreting code.  Because
@code{libgcj} includes a class loader which can dynamically load shared
objects, it is possible to give @code{gij} the name of a class which has
been compiled and put into a shared library on the class path.

@c man end

@c man begin OPTIONS gij

@table @gcctabopt
@item -cp @var{path}
@itemx -classpath @var{path}
Set the initial class path.  The class path is used for finding
class and resource files.  If specified, this option overrides the
@code{CLASSPATH} environment variable.  Note that this option is
ignored if @code{-jar} is used.

@item -D@var{name}[=@var{value}]
This defines a system property named @var{name} with value @var{value}.
If @var{value} is not specified then it defaults to the empty string.
These system properties are initialized at the program's startup and can
be retrieved at runtime using the @code{java.lang.System.getProperty}
method.

@item -ms=@var{number}
Equivalent to @code{-Xms}.

@item -mx=@var{number}
Equivalent to @code{-Xmx}.

@item -noverify
Do not verify compliance of bytecode with the VM specification. In addition,
this option disables type verification which is otherwise performed on BC-ABI
compiled code.

@item -X
@itemx -X@var{argument}
Supplying @code{-X} by itself will cause @code{gij} to list all the
supported @code{-X} options.  Currently these options are supported:

@table @gcctabopt
@item -Xms@var{size}
Set the initial heap size.

@item -Xmx@var{size}
Set the maximum heap size.

@item -Xss@var{size}
Set the thread stack size.
@end table

Unrecognized @code{-X} options are ignored, for compatibility with
other runtimes.

@item -jar
This indicates that the name passed to @code{gij} should be interpreted
as the name of a jar file, not a class.

@item --help
@itemx -?
Print help, then exit.

@item --showversion
Print version number and continue.

@item --fullversion
Print detailed version information, then exit.

@item --version
Print version number, then exit.

@item -verbose
@itemx -verbose:class
Each time a class is initialized, print a short message on standard error.
@end table

@code{gij} also recognizes and ignores the following options, for
compatibility with existing application launch scripts:
@code{-client}, @code{-server}, @code{-hotspot}, @code{-jrockit},
@code{-agentlib}, @code{-agentpath}, @code{-debug}, @code{-d32},
@code{-d64}, @code{-javaagent}, @code{-noclassgc}, @code{-verify},
and @code{-verifyremote}.

@c man end

@node Invoking gcj-dbtool
@chapter Invoking gcj-dbtool.

@c man title gcj-dbtool Manipulate class file mapping databases for libgcj

@ignore
@c man begin SYNOPSIS gcj-dbtool
gcj-dbtool @option{OPTION} @var{DBFILE} [@option{MORE}] @dots{}

gcj-dbtool [@option{-0}] [@option{-}] [@option{-n}] [@option{-a}] [@option{-f}]
  [@option{-t}] [@option{-l}] [@option{-p} [@var{LIBDIR}]]
  [@option{-v}] [@option{-m}] [@option{--version}] [@option{--help}]

@c man end
@c man begin SEEALSO gij
gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
and the Info entries for @file{gcj} and @file{gcc}.
@c man end
@end ignore

@c man begin DESCRIPTION gcj-dbtool

@code{gcj-dbtool} is a tool for creating and manipulating class file
mapping databases.  @code{libgcj} can use these databases to find a
shared library corresponding to the bytecode representation of a
class.  This functionality is useful for ahead-of-time compilation of
a program that has no knowledge of @code{gcj}.

@code{gcj-dbtool} works best if all the jar files added to it are
compiled using @code{-findirect-dispatch}.

Note that @code{gcj-dbtool} is currently available as ``preview
technology''.  We believe it is a reasonable way to allow
application-transparent ahead-of-time compilation, but this is an
unexplored area.  We welcome your comments.

@c man end

@c man begin OPTIONS gcj-dbtool

@table @gcctabopt
@item -n @var{DBFILE} [@var{SIZE}]
This creates a new database.  Currently, databases cannot be resized;
you can choose a larger initial size if desired.  The default size is
32,749.

@item -a @var{DBFILE} @var{JARFILE} @var{LIB}
@itemx -f @var{DBFILE} @var{JARFILE} @var{LIB}
This adds a jar file to the database.  For each class file in the jar,
a cryptographic signature of the bytecode representation of the class
is recorded in the database.  At runtime, a class is looked up by its
signature and the compiled form of the class is looked for in the
corresponding shared library.  The @option{-a} option will verify
that @var{LIB} exists before adding it to the database; @option{-f}
skips this check.

@item [@option{-}][@option{-0}] -m @var{DBFILE} @var{DBFILE},[@var{DBFILE}]
Merge a number of databases.  The output database overwrites any
existing database.  To add databases into an existing database,
include the destination in the list of sources.

If @option{-} or @option{-0} are used, the list of files to read is
taken from standard input instead of the command line.  For
@option{-0}, Input filenames are terminated by a null character
instead of by whitespace.  Useful when arguments might contain white
space.  The GNU find -print0 option produces input suitable for this
mode.

@item -t @var{DBFILE}
Test a database.

@item -l @var{DBFILE}
List the contents of a database.

@item -p
Print the name of the default database.  If there is no default
database, this prints a blank line.  If @var{LIBDIR} is specified, use
it instead of the default library directory component of the database
name.

@item --help
Print a help message, then exit.

@item --version
@itemx -v
Print version information, then exit.

@end table

@c man end

@node Invoking jv-convert
@chapter Invoking jv-convert

@c man title jv-convert Convert file from one encoding to another

@c man begin SYNOPSIS jv-convert
@command{jv-convert} [@option{OPTION}] @dots{} [@var{INPUTFILE} [@var{OUTPUTFILE}]]
@ignore

  [@option{--encoding} @var{name}]
  [@option{--from} @var{name}]
  [@option{--to} @var{name}]
  [@option{-i} @var{file}] [@option{-o} @var{file}]
  [@option{--reverse}] [@option{--help}] [@option{--version}]
@end ignore
@c man end

@c man begin DESCRIPTION jv-convert

@command{jv-convert} is a utility included with @code{libgcj} which
converts a file from one encoding to another.  It is similar to the Unix
@command{iconv} utility.

The encodings supported by @command{jv-convert} are platform-dependent.
Currently there is no way to get a list of all supported encodings.

@c man end

@c man begin OPTIONS jv-convert

@table @gcctabopt
@item --encoding @var{name}
@itemx --from @var{name}
Use @var{name} as the input encoding.  The default is the current
locale's encoding.

@item --to @var{name}
Use @var{name} as the output encoding.  The default is the
@code{JavaSrc} encoding; this is ASCII with @samp{\u} escapes for
non-ASCII characters.

@item -i @var{file}
Read from @var{file}.  The default is to read from standard input.

@item -o @var{file}
Write to @var{file}.  The default is to write to standard output.

@item --reverse
Swap the input and output encodings.

@item --help
Print a help message, then exit.

@item --version
Print version information, then exit.
@end table

@c man end

@node Invoking grmic
@chapter Invoking grmic

@c man title grmic Generate stubs for Remote Method Invocation

@c man begin SYNOPSIS grmic
@command{grmic} [@option{OPTION}] @dots{} @var{class} @dots{}
@ignore
  [@option{-keep}]
  [@option{-keepgenerated}]
  [@option{-v1.1}]
  [@option{-vcompat}]
  [@option{-v1.2}]
  [@option{-nocompile}]
  [@option{-verbose}]
  [@option{-d} @var{directory}]
  [@option{-help}]
  [@option{-version}]
@end ignore
@c man end

@c man begin DESCRIPTION grmic

@command{grmic} is a utility included with @code{libgcj} which generates
stubs for remote objects.

@c FIXME: Add real information here.
@c This really isn't much more than the --help output.

Note that this program isn't yet fully compatible with the JDK
@command{grmic}.  Some options, such as @option{-classpath}, are
recognized but currently ignored.  We have left these options
undocumented for now.

Long options can also be given with a GNU-style leading @samp{--}.  For
instance, @option{--help} is accepted.

@c man end

@c man begin OPTIONS grmic

@table @gcctabopt
@item -keep
@itemx -keepgenerated
By default, @command{grmic} deletes intermediate files.  Either of these
options causes it not to delete such files.

@item -v1.1
Cause @command{grmic} to create stubs and skeletons for the 1.1
protocol version.

@item -vcompat
Cause @command{grmic} to create stubs and skeletons compatible with both
the 1.1 and 1.2 protocol versions.  This is the default.

@item -v1.2
Cause @command{grmic} to create stubs and skeletons for the 1.2
protocol version.

@item -nocompile
Don't compile the generated files.

@item -verbose
Print information about what @command{grmic} is doing.

@item -d @var{directory}
Put output files in @var{directory}.  By default the files are put in
the current working directory.

@item -help
Print a help message, then exit.

@item -version
Print version information, then exit.
@end table

@c man end


@node Invoking grmiregistry
@chapter Invoking grmiregistry

@c man title grmiregistry Remote object registry

@c man begin SYNOPSIS grmiregistry
@command{grmic} [@option{OPTION}] @dots{} [@var{port}]
@ignore
  [@option{--help}]
  [@option{--version}]
@end ignore
@c man end

@c man begin DESCRIPTION grmiregistry

@command{grmiregistry} starts a remote object registry on the current
host.  If no port number is specified, then port 1099 is used.

@c FIXME: Add real information here.
@c This really isn't much more than the --help output.

@c man end

@c man begin OPTIONS grmiregistry

@table @gcctabopt
@item --help
Print a help message, then exit.

@item --version
Print version information, then exit.
@end table

@c man end


@node About CNI
@chapter About CNI

This documents CNI, the Compiled Native Interface,
which is is a convenient way to write Java native methods using C++.
This is a more efficient, more convenient, but less portable
alternative to the standard JNI (Java Native Interface).

@menu
* Basic concepts::              Introduction to using CNI@.
* Packages::                    How packages are mapped to C++.
* Primitive types::             Handling primitive Java types in C++.
* Reference types::             Handling Java reference types in C++.
* Interfaces::                  How Java interfaces map to C++.
* Objects and Classes::         C++ and Java classes.
* Class Initialization::        How objects are initialized.
* Object allocation::           How to create Java objects in C++.
* Memory allocation::           How to allocate and free memory.
* Arrays::                      Dealing with Java arrays in C++.
* Methods::                     Java methods in C++.
* Strings::                     Information about Java Strings.
* Mixing with C++::             How CNI can interoperate with C++.
* Exception Handling::          How exceptions are handled.
* Synchronization::             Synchronizing between Java and C++.
* Invocation::			Starting the Java runtime from C++.
* Reflection::                  Using reflection from C++.
@end menu


@node Basic concepts
@section Basic concepts

In terms of languages features, Java is mostly a subset
of C++.  Java has a few important extensions, plus a powerful standard
class library, but on the whole that does not change the basic similarity.
Java is a hybrid object-oriented language, with a few native types,
in addition to class types.  It is class-based, where a class may have
static as well as per-object fields, and static as well as instance methods.
Non-static methods may be virtual, and may be overloaded.  Overloading is
resolved at compile time by matching the actual argument types against
the parameter types.  Virtual methods are implemented using indirect calls
through a dispatch table (virtual function table).  Objects are
allocated on the heap, and initialized using a constructor method.
Classes are organized in a package hierarchy.

All of the listed attributes are also true of C++, though C++ has
extra features (for example in C++ objects may be allocated not just
on the heap, but also statically or in a local stack frame).  Because
@command{gcj} uses the same compiler technology as G++ (the GNU
C++ compiler), it is possible to make the intersection of the two
languages use the same ABI (object representation and calling
conventions).  The key idea in CNI is that Java objects are C++
objects, and all Java classes are C++ classes (but not the other way
around).  So the most important task in integrating Java and C++ is to
remove gratuitous incompatibilities.

You write CNI code as a regular C++ source file.  (You do have to use
a Java/CNI-aware C++ compiler, specifically a recent version of G++.)

@noindent A CNI C++ source file must have:

@example
#include <gcj/cni.h>
@end example

@noindent and then must include one header file for each Java class it uses, e.g.:

@example
#include <java/lang/Character.h>
#include <java/util/Date.h>
#include <java/lang/IndexOutOfBoundsException.h>
@end example

@noindent These header files are automatically generated by @code{gcjh}.


CNI provides some functions and macros to make using Java objects and
primitive types from C++ easier.  In general, these CNI functions and
macros start with the @code{Jv} prefix, for example the function
@code{JvNewObjectArray}.  This convention is used to avoid conflicts
with other libraries.  Internal functions in CNI start with the prefix
@code{_Jv_}.  You should not call these; if you find a need to, let us
know and we will try to come up with an alternate solution.


@subsection Limitations

Whilst a Java class is just a C++ class that doesn't mean that you are
freed from the shackles of Java, a @acronym{CNI} C++ class must adhere to the
rules of the Java programming language.

For example: it is not possible to declare a method in a CNI class
that will take a C string (@code{char*}) as an argument, or to declare a
member variable of some non-Java datatype.


@node Packages
@section Packages

The only global names in Java are class names, and packages.  A
@dfn{package} can contain zero or more classes, and also zero or more
sub-packages.  Every class belongs to either an unnamed package or a
package that has a hierarchical and globally unique name.

A Java package is mapped to a C++ @dfn{namespace}.  The Java class
@code{java.lang.String} is in the package @code{java.lang}, which is a
sub-package of @code{java}.  The C++ equivalent is the class
@code{java::lang::String}, which is in the namespace @code{java::lang}
which is in the namespace @code{java}.

@noindent Here is how you could express this:

@example
(// @r{Declare the class(es), possibly in a header file:}
namespace java @{
  namespace lang @{
    class Object;
    class String;
    ...
  @}
@}

class java::lang::String : public java::lang::Object
@{
  ...
@};
@end example

@noindent The @code{gcjh} tool automatically generates the necessary namespace
declarations.


@subsection Leaving out package names

Always using the fully-qualified name of a java class can be
tiresomely verbose.  Using the full qualified name also ties the code
to a single package making code changes necessary should the class
move from one package to another.  The Java @code{package} declaration
specifies that the following class declarations are in the named
package, without having to explicitly name the full package
qualifiers.  The @code{package} declaration can be
followed by zero or more @code{import} declarations, which
allows either a single class or all the classes in a package to be
named by a simple identifier.  C++ provides something similar with the
@code{using} declaration and directive.

@noindent In Java:

@example
import @var{package-name}.@var{class-name};
@end example

@noindent allows the program text to refer to @var{class-name} as a shorthand for 
the fully qualified name: @code{@var{package-name}.@var{class-name}}.


@noindent To achieve the same effect C++, you have to do this:

@example
using @var{package-name}::@var{class-name};
@end example


@noindent Java can also cause imports on demand, like this:

@example
import @var{package-name}.*;
@end example

@noindent Doing this allows any class from the package @var{package-name} to be
referred to only by its class-name within the program text.


@noindent The same effect can be achieved in C++ like this:

@example
using namespace @var{package-name};
@end example


@node Primitive types
@section Primitive types

Java provides 8 @dfn{primitives} types which represent integers, floats, 
characters and booleans (and also the void type).  C++ has its own
very similar concrete types.  Such types in C++ however are not always
implemented in the same way (an int might be 16, 32 or 64 bits for example) 
so CNI provides a special C++ type for each primitive Java type:

@multitable @columnfractions .20 .25 .60
@item @strong{Java type}   @tab @strong{C/C++ typename} @tab @strong{Description}
@item @code{char}        @tab @code{jchar}          @tab 16 bit Unicode character
@item @code{boolean}     @tab @code{jboolean}       @tab logical (true or false) values
@item @code{byte}        @tab @code{jbyte}          @tab 8-bit signed integer
@item @code{short}       @tab @code{jshort}         @tab 16 bit signed integer
@item @code{int}         @tab @code{jint}           @tab 32 bit signed integer
@item @code{long}        @tab @code{jlong}          @tab 64 bit signed integer
@item @code{float}       @tab @code{jfloat}         @tab 32 bit IEEE floating point number
@item @code{double}      @tab @code{jdouble}        @tab 64 bit IEEE floating point number
@item @code{void}        @tab @code{void}           @tab no value
@end multitable

When referring to a Java type You should always use these C++ typenames (e.g.: @code{jint})
to avoid disappointment.


@subsection Reference types associated with primitive types

In Java each primitive type has an associated reference type, 
e.g.: @code{boolean} has an associated @code{java.lang.Boolean.TYPE} class.
In order to make working with such classes easier GCJ provides the macro
@code{JvPrimClass}:

@deffn macro JvPrimClass type
Return a pointer to the @code{Class} object corresponding to the type supplied.

@example
JvPrimClass(void) @result{} java.lang.Void.TYPE
@end example

@end deffn


@node Reference types
@section Reference types

A Java reference type is treated as a class in C++.  Classes and
interfaces are handled this way.  A Java reference is translated to a
C++ pointer, so for instance a Java @code{java.lang.String} becomes,
in C++, @code{java::lang::String *}.

CNI provides a few built-in typedefs for the most common classes:
@multitable @columnfractions .30 .25 .60
@item @strong{Java type} @tab @strong{C++ typename} @tab @strong{Description}
@item @code{java.lang.Object} @tab @code{jobject} @tab Object type
@item @code{java.lang.String} @tab @code{jstring} @tab String type
@item @code{java.lang.Class} @tab @code{jclass} @tab Class type
@end multitable
@cindex jobject
@cindex jstring
@cindex jclass

Every Java class or interface has a corresponding @code{Class}
instance.  These can be accessed in CNI via the static @code{class$}
field of a class.  The @code{class$} field is of type @code{Class}
(and not @code{Class *}), so you will typically take the address of
it.
@cindex class$

Here is how you can refer to the class of @code{String}, which in
Java would be written @code{String.class}:

@example
using namespace java::lang;
doSomething (&String::class$);
@end example


@node Interfaces
@section Interfaces

A Java class can @dfn{implement} zero or more
@dfn{interfaces}, in addition to inheriting from
a single base class. 

@acronym{CNI} allows CNI code to implement methods of interfaces.
You can also call methods through interface references, with some
limitations.

@acronym{CNI} doesn't understand interface inheritance at all yet.  So,
you can only call an interface method when the declared type of the
field being called matches the interface which declares that
method.  The workaround is to cast the interface reference to the right
superinterface.
 
For example if you have: 

@example 
interface A 
@{ 
  void a(); 
@} 
 
interface B extends A 
@{ 
  void b(); 
@} 
@end example
 
and declare a variable of type @code{B} in C++, you can't call
@code{a()} unless you cast it to an @code{A} first.

@node Objects and Classes
@section Objects and Classes

@subsection Classes

All Java classes are derived from @code{java.lang.Object}.  C++ does
not have a unique root class, but we use the C++ class
@code{java::lang::Object} as the C++ version of the
@code{java.lang.Object} Java class.  All other Java classes are mapped
into corresponding C++ classes derived from @code{java::lang::Object}.

Interface inheritance (the @code{implements} keyword) is currently not
reflected in the C++ mapping.


@subsection Object fields

Each object contains an object header, followed by the instance fields
of the class, in order.  The object header consists of a single
pointer to a dispatch or virtual function table.  (There may be extra
fields @emph{in front of} the object, for example for memory
management, but this is invisible to the application, and the
reference to the object points to the dispatch table pointer.)

The fields are laid out in the same order, alignment, and size as in
C++.  Specifically, 8-bit and 16-bit native types (@code{byte},
@code{short}, @code{char}, and @code{boolean}) are @emph{not} widened
to 32 bits.  Note that the Java VM does extend 8-bit and 16-bit types
to 32 bits when on the VM stack or temporary registers.

If you include the @code{gcjh}-generated header for a
class, you can access fields of Java classes in the @emph{natural}
way.  For example, given the following Java class:

@example
public class Int
@{
  public int i;
  public Int (int i) @{ this.i = i; @}
  public static Int zero = new Int(0);
@}
@end example

you can write:

@example
#include <gcj/cni.h>;
#include <Int>;

Int*
mult (Int *p, jint k)
@{
  if (k == 0)
    return Int::zero;  // @r{Static member access.}
  return new Int(p->i * k);
@}
@end example


@subsection Access specifiers

CNI does not strictly enforce the Java access
specifiers, because Java permissions cannot be directly mapped
into C++ permission.  Private Java fields and methods are mapped
to private C++ fields and methods, but other fields and methods
are mapped to public fields and methods.



@node Class Initialization
@section Class Initialization

Java requires that each class be automatically initialized at the time 
of the first active use.  Initializing a class involves 
initializing the static fields, running code in class initializer 
methods, and initializing base classes.  There may also be 
some implementation specific actions, such as allocating 
@code{String} objects corresponding to string literals in
the code.

The GCJ compiler inserts calls to @code{JvInitClass} at appropriate
places to ensure that a class is initialized when required.  The C++
compiler does not insert these calls automatically---it is the
programmer's responsibility to make sure classes are initialized.
However, this is fairly painless because of the conventions assumed by
the Java system.

First, @code{libgcj} will make sure a class is initialized before an
instance of that object is created.  This is one of the
responsibilities of the @code{new} operation.  This is taken care of
both in Java code, and in C++ code.  When G++ sees a @code{new} of a
Java class, it will call a routine in @code{libgcj} to allocate the
object, and that routine will take care of initializing the class.
Note however that this does not happen for Java arrays; you must
allocate those using the appropriate CNI function.  It follows that
you can access an instance field, or call an instance (non-static)
method and be safe in the knowledge that the class and all of its base
classes have been initialized.

Invoking a static method is also safe.  This is because the
Java compiler adds code to the start of a static method to make sure
the class is initialized.  However, the C++ compiler does not
add this extra code.  Hence, if you write a native static method
using CNI, you are responsible for calling @code{JvInitClass}
before doing anything else in the method (unless you are sure
it is safe to leave it out).

Accessing a static field also requires the class of the
field to be initialized.  The Java compiler will generate code
to call @code{JvInitClass} before getting or setting the field.
However, the C++ compiler will not generate this extra code,
so it is your responsibility to make sure the class is
initialized before you access a static field from C++.


@node Object allocation
@section Object allocation

New Java objects are allocated using a
@dfn{class instance creation expression}, e.g.:

@example
new @var{Type} ( ... )
@end example

The same syntax is used in C++.  The main difference is that
C++ objects have to be explicitly deleted; in Java they are
automatically deleted by the garbage collector.
Using @acronym{CNI}, you can allocate a new Java object
using standard C++ syntax and the C++ compiler will allocate
memory from the garbage collector.  If you have overloaded
constructors, the compiler will choose the correct one
using standard C++ overload resolution rules.  

@noindent For example:

@example
java::util::Hashtable *ht = new java::util::Hashtable(120);
@end example


@node Memory allocation
@section Memory allocation

When allocating memory in @acronym{CNI} methods it is best to handle
out-of-memory conditions by throwing a Java exception.  These
functions are provided for that purpose:

@deftypefun void* JvMalloc (jsize @var{size})
Calls malloc.  Throws @code{java.lang.OutOfMemoryError} if allocation
fails.
@end deftypefun

@deftypefun void* JvRealloc (void* @var{ptr}, jsize @var{size})
Calls realloc.  Throws @code{java.lang.OutOfMemoryError} if
reallocation fails.
@end deftypefun

@deftypefun void JvFree (void* @var{ptr})
Calls free.
@end deftypefun

@node Arrays
@section Arrays

While in many ways Java is similar to C and C++, it is quite different
in its treatment of arrays.  C arrays are based on the idea of pointer
arithmetic, which would be incompatible with Java's security
requirements.  Java arrays are true objects (array types inherit from
@code{java.lang.Object}).  An array-valued variable is one that
contains a reference (pointer) to an array object.

Referencing a Java array in C++ code is done using the
@code{JArray} template, which as defined as follows:

@example
class __JArray : public java::lang::Object
@{
public:
  int length;
@};

template<class T>
class JArray : public __JArray
@{
  T data[0];
public:
  T& operator[](jint i) @{ return data[i]; @}
@};
@end example


There are a number of @code{typedef}s which correspond to @code{typedef}s 
from the @acronym{JNI}.  Each is the type of an array holding objects
of the relevant type:

@example
typedef __JArray *jarray;
typedef JArray<jobject> *jobjectArray;
typedef JArray<jboolean> *jbooleanArray;
typedef JArray<jbyte> *jbyteArray;
typedef JArray<jchar> *jcharArray;
typedef JArray<jshort> *jshortArray;
typedef JArray<jint> *jintArray;
typedef JArray<jlong> *jlongArray;
typedef JArray<jfloat> *jfloatArray;
typedef JArray<jdouble> *jdoubleArray;
@end example


@deftypemethod {template<class T>} T* elements (JArray<T> @var{array})
This template function can be used to get a pointer to the elements of
the @code{array}.  For instance, you can fetch a pointer to the
integers that make up an @code{int[]} like so:

@example
extern jintArray foo;
jint *intp = elements (foo);
@end example

The name of this function may change in the future.
@end deftypemethod


@deftypefun jobjectArray JvNewObjectArray (jsize @var{length}, jclass @var{klass}, jobject @var{init})
This creates a new array whose elements have reference type.
@code{klass} is the type of elements of the array and
@code{init} is the initial value put into every slot in the array.
@end deftypefun

@example
using namespace java::lang;
JArray<String *> *array
  = (JArray<String *> *) JvNewObjectArray(length, &String::class$, NULL);
@end example


@subsection Creating arrays

For each primitive type there is a function which can be used to
create a new array of that type.  The name of the function is of the
form:

@example
JvNew@var{Type}Array
@end example

@noindent For example:

@example
JvNewBooleanArray
@end example

@noindent can be used to create an array of Java primitive boolean types.

@noindent The following function definition is the template for all such functions:

@deftypefun jbooleanArray JvNewBooleanArray (jint @var{length})
Create's an array @var{length} indices long.
@end deftypefun

@deftypefun jsize JvGetArrayLength (jarray @var{array})
Returns the length of the @var{array}.
@end deftypefun


@node Methods
@section Methods

Java methods are mapped directly into C++ methods.
The header files generated by @code{gcjh}
include the appropriate method definitions.
Basically, the generated methods have the same names and
@emph{corresponding} types as the Java methods,
and are called in the natural manner.

@subsection Overloading

Both Java and C++ provide method overloading, where multiple
methods in a class have the same name, and the correct one is chosen
(at compile time) depending on the argument types.
The rules for choosing the correct method are (as expected) more complicated
in C++ than in Java, but given a set of overloaded methods
generated by @code{gcjh} the C++ compiler will choose
the expected one.

Common assemblers and linkers are not aware of C++ overloading,
so the standard implementation strategy is to encode the
parameter types of a method into its assembly-level name.
This encoding is called @dfn{mangling},
and the encoded name is the @dfn{mangled name}.
The same mechanism is used to implement Java overloading.
For C++/Java interoperability, it is important that both the Java
and C++ compilers use the @emph{same} encoding scheme.

@subsection Static methods

Static Java methods are invoked in @acronym{CNI} using the standard
C++ syntax, using the @code{::} operator rather
than the @code{.} operator.  

@noindent For example:

@example
jint i = java::lang::Math::round((jfloat) 2.3);
@end example

@noindent C++ method definition syntax is used to define a static native method.
For example:

@example
#include <java/lang/Integer>
java::lang::Integer*
java::lang::Integer::getInteger(jstring str)
@{
  ...
@}
@end example


@subsection Object Constructors

Constructors are called implicitly as part of object allocation
using the @code{new} operator.  

@noindent For example:

@example
java::lang::Integer *x = new java::lang::Integer(234);
@end example

Java does not allow a constructor to be a native method.
This limitation can be coded round however because a constructor
can @emph{call} a native method.


@subsection Instance methods

Calling a Java instance method from a C++ @acronym{CNI} method is done 
using the standard C++ syntax, e.g.:

@example
// @r{First create the Java object.}
java::lang::Integer *x = new java::lang::Integer(234);
// @r{Now call a method.}
jint prim_value = x->intValue();
if (x->longValue == 0) 
  ...
@end example

@noindent Defining a Java native instance method is also done the natural way:

@example
#include <java/lang/Integer.h>

jdouble
java::lang:Integer::doubleValue()
@{
  return (jdouble) value;
@}
@end example


@subsection Interface methods

In Java you can call a method using an interface reference.  This is
supported, but not completely.  @xref{Interfaces}.




@node Strings
@section Strings

@acronym{CNI} provides a number of utility functions for
working with Java Java @code{String} objects.
The names and interfaces are analogous to those of @acronym{JNI}.


@deftypefun jstring JvNewString (const char* @var{chars}, jsize @var{len})
Returns a Java @code{String} object with characters from the C string
@var{chars} up to the index @var{len} in that array.
@end deftypefun

@deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}, jsize @var{len})
Returns a Java @code{String} made up of @var{len} bytes from @var{bytes}.
@end deftypefun


@deftypefun jstring JvNewStringLatin1 (const char* @var{bytes})
As above but the length of the @code{String} is @code{strlen(@var{bytes})}.
@end deftypefun

@deftypefun jstring JvNewStringUTF (const char* @var{bytes})
Returns a @code{String} which is made up of the UTF encoded characters
present in the C string @var{bytes}.
@end deftypefun

@deftypefun jchar* JvGetStringChars (jstring @var{str})
Returns a pointer to an array of characters making up the @code{String} @var{str}.
@end deftypefun

@deftypefun int JvGetStringUTFLength (jstring @var{str})
Returns the number of bytes required to encode the contents of the
@code{String} @var{str} in UTF-8.
@end deftypefun

@deftypefun jsize JvGetStringUTFRegion (jstring @var{str}, jsize @var{start}, jsize @var{len}, char* @var{buf})
Puts the UTF-8 encoding of a region of the @code{String} @var{str} into 
the buffer @code{buf}.  The region to fetch is marked by @var{start} and @var{len}.

Note that @var{buf} is a buffer, not a C string.  It is @emph{not} 
null terminated.
@end deftypefun


@node Mixing with C++
@section Interoperating with C/C++

Because @acronym{CNI} is designed to represent Java classes and methods it
cannot be mixed readily with C/C++ types.

One important restriction is that Java classes cannot have non-Java
type instance or static variables and cannot have methods which take
non-Java types as arguments or return non-Java types.

@noindent None of the following is possible with CNI:

@example

class ::MyClass : public java::lang::Object
@{
   char* variable;  // @r{char* is not a valid Java type.}
@}


uint
::SomeClass::someMethod (char *arg)
@{
  .
  .
  .
@}   // @r{@code{uint} is not a valid Java type, neither is @code{char*}}
@end example

@noindent Of course, it is ok to use C/C++ types within the scope of a method:


@example
jint
::SomeClass::otherMethod (jstring str)
@{
   char *arg = ...
   .
   .
   .
@}
@end example

@subsection RawData

The above restriction can be problematic, so @acronym{CNI} includes the
@code{gnu.gcj.RawData} class.  The @code{RawData} class is a
@dfn{non-scanned reference} type.  In other words variables declared
of type @code{RawData} can contain any data and are not checked by the
compiler or memory manager in any way.

This means that you can put C/C++ data structures (including classes)
in your @acronym{CNI} classes, as long as you use the appropriate cast.

@noindent Here are some examples:

@example

class ::MyClass : public java::lang::Object
@{
   gnu.gcj.RawData string;

   MyClass ();
   gnu.gcj.RawData getText ();
   void printText ();
@}

::MyClass::MyClass ()
@{
   char* text = ...
   string = text;
@}

gnu.gcj.RawData
::MyClass::getText ()
@{
   return string;
@}

void
::MyClass::printText ()
@{
  printf("%s\n", (char*) string);
@}
@end example


@subsection RawDataManaged

@code{gnu.gcj.RawDataManaged} is another type used to indicate special data used 
by native code. Unlike the @code{RawData} type, fields declared as 
@code{RawDataManaged} will be "marked" by the memory manager and 
considered for garbage collection.  

Native data which is allocated using CNI's @code{JvAllocBytes()}
function and stored in a @code{RawDataManaged} will be automatically 
freed when the Java object it is associated with becomes unreachable.

@subsection Native memory allocation

@deftypefun void* JvAllocBytes (jsize @var{size})
Allocates @var{size} bytes from the heap.  The memory returned is zeroed.
This memory is not scanned for pointers by the garbage collector, but will 
be freed if no references to it are discovered.

This function can be useful if you need to associate some native data with a
Java object. Using a CNI's special @code{RawDataManaged} type, native data 
allocated with @code{JvAllocBytes} will be automatically freed when the Java 
object itself becomes unreachable.
@end deftypefun

@subsection Posix signals

On Posix based systems the @code{libgcj} library uses several signals
internally.  @acronym{CNI} code should not attempt to use the same
signals as doing so may cause @code{libgcj} and/or the @acronym{CNI}
code to fail.

SIGSEGV is used on many systems to generate
@code{NullPointerExceptions}.  SIGCHLD is used internally by
@code{Runtime.exec()}.  Several other signals (that vary from platform to
platform) can be used by the memory manager and by
@code{Thread.interrupt()}.

@node Exception Handling
@section Exception Handling

While C++ and Java share a common exception handling framework,
things are not yet perfectly integrated.  The main issue is that the
run-time type information facilities of the two
languages are not integrated.

Still, things work fairly well.  You can throw a Java exception from
C++ using the ordinary @code{throw} construct, and this
exception can be caught by Java code.  Similarly, you can catch an
exception thrown from Java using the C++ @code{catch}
construct.

@noindent Here is an example:

@example
if (i >= count)
   throw new java::lang::IndexOutOfBoundsException();
@end example

Normally, G++ will automatically detect when you are writing C++
code that uses Java exceptions, and handle them appropriately.
However, if C++ code only needs to execute destructors when Java
exceptions are thrown through it, GCC will guess incorrectly.  Sample
problematic code:

@example
struct S @{ ~S(); @};

extern void bar();    // @r{Is implemented in Java and may throw exceptions.}

void foo()
@{
  S s;
  bar();
@}
@end example

The usual effect of an incorrect guess is a link failure, complaining of
a missing routine called @code{__gxx_personality_v0}.

You can inform the compiler that Java exceptions are to be used in a
translation unit, irrespective of what it might think, by writing
@code{#pragma GCC java_exceptions} at the head of the
file.  This @code{#pragma} must appear before any
functions that throw or catch exceptions, or run destructors when
exceptions are thrown through them.

@node Synchronization
@section Synchronization

Each Java object has an implicit monitor.
The Java VM uses the instruction @code{monitorenter} to acquire
and lock a monitor, and @code{monitorexit} to release it.

The corresponding CNI macros are @code{JvMonitorEnter} and 
@code{JvMonitorExit} (JNI has similar  methods @code{MonitorEnter}
and @code{MonitorExit}).  


The Java source language does not provide direct access to these primitives.
Instead, there is a @code{synchronized} statement that does an
implicit @code{monitorenter} before entry to the block,
and does a @code{monitorexit} on exit from the block.
Note that the lock has to be released even when the block is abnormally
terminated by an exception, which means there is an implicit
@code{try finally} surrounding synchronization locks.

From C++, it makes sense to use a destructor to release a lock.
@acronym{CNI} defines the following utility class:

@example
class JvSynchronize() @{
  jobject obj;
  JvSynchronize(jobject o) @{ obj = o; JvMonitorEnter(o); @}
  ~JvSynchronize() @{ JvMonitorExit(obj); @}
@};
@end example

So this Java code:

@example
synchronized (OBJ)
@{
   CODE
@}
@end example

@noindent might become this C++ code:

@example
@{
   JvSynchronize dummy (OBJ);
   CODE;
@}
@end example

Java also has methods with the @code{synchronized} attribute.
This is equivalent to wrapping the entire method body in a
@code{synchronized} statement.
(Alternatively, an implementation could require the caller to do
the synchronization.  This is not practical for a compiler, because
each virtual method call would have to test at run-time if
synchronization is needed.)  Since in @command{gcj}
the @code{synchronized} attribute is handled by the
method implementation, it is up to the programmer
of a synchronized native method to handle the synchronization
(in the C++ implementation of the method).
In other words, you need to manually add @code{JvSynchronize}
in a @code{native synchronized} method.

@node Invocation
@section Invocation

CNI permits C++ applications to make calls into Java classes, in addition to
allowing Java code to call into C++. Several functions, known as the 
@dfn{invocation API}, are provided to support this.

@deftypefun jint JvCreateJavaVM (JvVMInitArgs* @var{vm_args})

Initializes the Java runtime. This function performs essential initialization
of the threads interface, garbage collector, exception handling and other key
aspects of the runtime. It must be called once by an application with
a non-Java @code{main()} function, before any other Java or CNI calls are made.
It is safe, but not recommended, to call @code{JvCreateJavaVM()} more than
once provided it is only called from a single thread.
The @var{vmargs} parameter can be used to specify initialization parameters 
for the Java runtime. It may be @code{NULL}.

JvVMInitArgs represents a list of virtual machine initialization
arguments. @code{JvCreateJavaVM()} ignores the version field.

@example
typedef struct JvVMOption
@{
  // a VM initialization option
  char* optionString;
  // extra information associated with this option
  void* extraInfo;
@} JvVMOption;

typedef struct JvVMInitArgs
@{
  // for compatibility with JavaVMInitArgs
  jint version;

  // number of VM initialization options
  jint nOptions;

  // an array of VM initialization options
  JvVMOption* options;

  // true if the option parser should ignore unrecognized options
  jboolean ignoreUnrecognized;
@} JvVMInitArgs;
@end example

@code{JvCreateJavaVM()} returns @code{0} upon success, or @code{-1} if
the runtime is already initialized.

@emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It
is recognized and used as of release 4.0.
@end deftypefun

@deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group})
Registers an existing thread with the Java runtime.  This must be called once
from each thread, before that thread makes any other Java or CNI calls. It
must be called after @code{JvCreateJavaVM}.
@var{name} specifies a name for the thread. It may be @code{NULL}, in which 
case a name will be generated.
@var{group} is the ThreadGroup in which this thread will be a member. If it
is @code{NULL}, the thread will be a member of the main thread group.
The return value is the Java @code{Thread} object that represents the thread.
It is safe to call @code{JvAttachCurrentThread()} more than once from the same
thread. If the thread is already attached, the call is ignored and the current
thread object is returned.
@end deftypefun

@deftypefun jint JvDetachCurrentThread ()
Unregisters a thread from the Java runtime. This should be called by threads
that were attached using @code{JvAttachCurrentThread()}, after they have 
finished making calls to Java code. This ensures that any resources associated
with the thread become eligible for garbage collection.
This function returns @code{0} upon success, or @code{-1} if the current thread
is not attached.
@end deftypefun

@subsection Handling uncaught exceptions

If an exception is thrown from Java code called using the invocation API, and
no handler for the exception can be found, the runtime will abort the
application. In order to make the application more robust, it is recommended 
that code which uses the invocation API be wrapped by a top-level try/catch 
block that catches all Java exceptions.

@subsection Example

The following code demonstrates the use of the invocation API. In this
example, the C++ application initializes the Java runtime and attaches
itself. The @code{java.lang.System} class is initialized in order to
access its @code{out} field, and a Java string is printed. Finally, the thread
is detached from the runtime once it has finished making Java calls. Everything
is wrapped with a try/catch block to provide a default handler for any uncaught 
exceptions.

The example can be compiled with @command{c++ -c test.cc; gcj test.o}.

@example
// test.cc
#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>

int main(int argc, char *argv[])
@{
  using namespace java::lang;
  
  try
  @{
    JvCreateJavaVM(NULL);
    JvAttachCurrentThread(NULL, NULL);

    String *message = JvNewStringLatin1("Hello from C++");
    JvInitClass(&System::class$);
    System::out->println(message);

    JvDetachCurrentThread();
  @}
  catch (Throwable *t)
  @{
    System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
    t->printStackTrace();
  @}
@}
@end example

@node Reflection
@section Reflection

Reflection is possible with CNI code, it functions similarly to how it
functions with JNI@.

@c clean this up...  I mean, what are the types jfieldID and jmethodID in JNI?
The types @code{jfieldID} and @code{jmethodID}
are as in JNI@.

@noindent The functions:

@itemize
@item @code{JvFromReflectedField},
@item @code{JvFromReflectedMethod},
@item @code{JvToReflectedField}
@item @code{JvToFromReflectedMethod}
@end itemize

@noindent will be added shortly, as will other functions corresponding to JNI@.


@node System properties
@chapter System properties

The runtime behavior of the @code{libgcj} library can be modified by setting
certain system properties.  These properties can be compiled into the program
using the @code{-D@var{name}[=@var{value}]} option to @command{gcj} or by
setting them explicitly in the program by calling the
@code{java.lang.System.setProperty()} method.  Some system properties are only
used for informational purposes (like giving a version number or a user name).
A program can inspect the current value of a property by calling the
@code{java.lang.System.getProperty()} method.

@menu
* Standard Properties::         Standard properties supported by @code{libgcj}
* GNU Classpath Properties::    Properties found in Classpath based libraries
* libgcj Runtime Properties::   Properties specific to @code{libgcj}
@end menu

@node Standard Properties
@section Standard Properties

The following properties are normally found in all implementations of the core
libraries for the Java language.

@table @gcctabopt

@item java.version
The @code{libgcj} version number.

@item java.vendor
Set to @samp{The Free Software Foundation, Inc.}

@item java.vendor.url
Set to @uref{http://gcc.gnu.org/java/}.

@item java.home
The directory where @code{gcj} was installed.  Taken from the @code{--prefix}
option given to @command{configure}.

@item java.class.version
The class format version number supported by the libgcj byte code interpreter.
(Currently @samp{46.0})

@item java.vm.specification.version
The Virtual Machine Specification version implemented by @code{libgcj}.
(Currently @samp{1.0})

@item java.vm.specification.vendor
The name of the Virtual Machine specification designer.

@item java.vm.specification.name
The name of the Virtual Machine specification
(Set to @samp{Java Virtual Machine Specification}).

@item java.vm.version
The @command{gcj} version number.

@item java.vm.vendor
Set to @samp{The Free Software Foundation, Inc.}

@item java.vm.name
Set to @samp{GNU libgcj}.

@item java.specification.version
The Runtime Environment specification version implemented by @code{libgcj}.
(Currently set to @samp{1.3})

@item java.specification.vendor
The Runtime Environment specification designer.

@item java.specification.name
The name of the Runtime Environment specification
(Set to @samp{Java Platform API Specification}).

@item java.class.path
The paths (jar files, zip files and directories) used for finding class files.

@item java.library.path
Directory path used for finding native libraries.

@item java.io.tmpdir
The directory used to put temporary files in.

@item java.compiler
Name of the Just In Time compiler to use by the byte code interpreter.
Currently not used in @code{libgcj}.

@item java.ext.dirs
Directories containing jar files with extra libraries.  Will be used when
resolving classes.

@item java.protocol.handler.pkgs
A @samp{|} separated list of package names that is used to find classes that
implement handlers for @code{java.net.URL}.

@item java.rmi.server.codebase
A list of URLs that is used by the @code{java.rmi.server.RMIClassLoader}
to load classes from.

@item jdbc.drivers
A list of class names that will be loaded by the @code{java.sql.DriverManager}
when it starts up.

@item file.separator
The separator used in when directories are included in a filename
(normally @samp{/} or @samp{\} ).

@item file.encoding
The default character encoding used when converting platform native files to
Unicode (usually set to @samp{8859_1}).

@item path.separator
The standard separator used when a string contains multiple paths
(normally @samp{:} or @samp{;}), the string is usually not a valid character
to use in normal directory names.)

@item line.separator
The default line separator used on the platform (normally @samp{\n}, @samp{\r}
or a combination of those two characters).

@item policy.provider
The class name used for the default policy provider returned by
@code{java.security.Policy.getPolicy}.

@item user.name
The name of the user running the program.  Can be the full name, the login name
or empty if unknown.

@item user.home
The default directory to put user specific files in.

@item user.dir
The current working directory from which the program was started.

@item user.language
The default language as used by the @code{java.util.Locale} class.

@item user.region
The default region as used by the @code{java.util.Local} class.

@item user.variant
The default variant of the language and region local used.

@item user.timezone
The default timezone as used by the @code{java.util.TimeZone} class.

@item os.name
The operating system/kernel name that the program runs on.

@item os.arch
The hardware that we are running on.

@item os.version
The version number of the operating system/kernel.

@item awt.appletWarning
The string to display when an untrusted applet is displayed.
Returned by @code{java.awt.Window.getWarningString()} when the window is
``insecure''.

@item awt.toolkit
The class name used for initializing the default @code{java.awt.Toolkit}. 
Defaults to @code{gnu.awt.gtk.GtkToolkit}.

@item http.proxyHost
Name of proxy host for http connections.

@item http.proxyPort
Port number to use when a proxy host is in use.

@end table

@node GNU Classpath Properties
@section GNU Classpath Properties

@code{libgcj} is based on the GNU Classpath (Essential Libraries for Java) a
GNU project to create free core class libraries for use with virtual machines
and compilers for the Java language.  The following properties are common to
libraries based on GNU Classpath.

@table @gcctabopt

@item gcj.dumpobject
Enables printing serialization debugging by the @code{java.io.ObjectInput} and
@code{java.io.ObjectOutput} classes when set to something else then the empty
string.  Only used when running a debug build of the library.

@item gnu.classpath.vm.shortname
This is a succinct name of the virtual machine.  For @code{libgcj},
this will always be @samp{libgcj}.

@item gnu.classpath.home.url
A base URL used for finding system property files (e.g.,
@file{classpath.security}).  By default this is a @samp{file:} URL
pointing to the @file{lib} directory under @samp{java.home}.

@end table

@node libgcj Runtime Properties
@section libgcj Runtime Properties

The following properties are specific to the @code{libgcj} runtime and will
normally not be found in other core libraries for the java language.

@table @gcctabopt

@item java.fullversion
The combination of @code{java.vm.name} and @code{java.vm.version}.

@item java.vm.info
Same as @code{java.fullversion}.

@item impl.prefix
Used by the @code{java.net.DatagramSocket} class when set to something else
then the empty string.  When set all newly created @code{DatagramSocket}s will
try to load a class @code{java.net.[impl.prefix]DatagramSocketImpl} instead of
the normal @code{java.net.PlainDatagramSocketImpl}.

@item gnu.gcj.progname
The class or binary name that was used to invoke the program. This will be
the name of the "main" class in the case where the @code{gij} front end is
used, or the program binary name in the case where an application is compiled 
to a native binary.

@item gnu.gcj.user.realname
The real name of the user, as taken from the password file.  This may
not always hold only the user's name (as some sites put extra
information in this field).  Also, this property is not available on
all platforms.

@item gnu.gcj.runtime.NameFinder.use_addr2line
Whether an external process, @command{addr2line}, should be used to determine
line number information when tracing the stack. Setting this to @code{false} 
may suppress line numbers when printing stack traces and when using
the java.util.logging infrastructure. However, performance may improve
significantly for applications that print stack traces or make logging calls
frequently.

@item gnu.gcj.runtime.NameFinder.show_raw
Whether the address of a stack frame should be printed when the line
number is unavailable. Setting this to @code{true} will cause the name
of the object and the offset within that object to be printed when no
line number is available.  This allows for off-line decoding of
stack traces if necessary debug information is available.  The default
is @code{false}, no raw addresses are printed.

@item gnu.gcj.runtime.NameFinder.remove_unknown
Whether stack frames for non-java code should be included in a stack
trace.  The default value is @code{true}, stack frames for non-java
code are suppressed.  Setting this to @code{false} will cause any
non-java stack frames to be printed in addition to frames for the java
code.

@item gnu.gcj.runtime.VMClassLoader.library_control
This controls how shared libraries are automatically loaded by the
built-in class loader.  If this property is set to @samp{full}, a full
search is done for each requested class.  If this property is set to
@samp{cache}, then any failed lookups are cached and not tried again.
If this property is set to @samp{never} (the default), then lookups
are never done.  For more information, @xref{Extensions}.

@item gnu.gcj.runtime.endorsed.dirs
This is like the standard @code{java.endorsed.dirs}, property, but
specifies some extra directories which are searched after the standard
endorsed directories.  This is primarily useful for telling
@code{libgcj} about additional libraries which are ordinarily
incorporated into the JDK, and which should be loaded by the bootstrap
class loader, but which are not yet part of @code{libgcj} itself for
some reason.

@item gnu.gcj.jit.compiler
@c FIXME we should probably have a whole node on this...
This is the full path to @command{gcj} executable which should be
used to compile classes just-in-time when
@code{ClassLoader.defineClass} is called.  If not set, @command{gcj}
will not be invoked by the runtime; this can also be controlled via
@code{Compiler.disable}.

@item gnu.gcj.jit.options
This is a space-separated string of options which should be passed to
@command{gcj} when in JIT mode.  If not set, a sensible default is
chosen.

@item gnu.gcj.jit.cachedir
This is the directory where cached shared library files are
stored.  If not set, JIT compilation is disabled.  This should never
be set to a directory that is writable by any other user.

@item gnu.gcj.precompiled.db.path
This is a sequence of file names, each referring to a file created by
@command{gcj-dbtool}.  These files will be used by @code{libgcj} to
find shared libraries corresponding to classes that are loaded from
bytecode.  @code{libgcj} often has a built-in default database; it
can be queried using @code{gcj-dbtool -p}.

@end table


@node Resources
@chapter Resources

While writing @command{gcj} and @code{libgcj} we have, of course, relied
heavily on documentation from Sun Microsystems.  In particular we have
used The Java Language Specification (both first and second editions),
the Java Class Libraries (volumes one and two), and the Java Virtual
Machine Specification.  In addition we've used the online documentation
at @uref{http://java.sun.com/}.

The current @command{gcj} home page is
@uref{http://gcc.gnu.org/java/}.

For more information on gcc, see @uref{http://gcc.gnu.org/}.

Some @code{libgcj} testing is done using the Mauve test suite.  This is
a free software Java class library test suite which is being written
because the JCK is not free.  See
@uref{http://sources.redhat.com/mauve/} for more information.


@node Index
@unnumbered Index

@printindex cp

@bye
