| \input texinfo @c -*-texinfo-*- |
| @setfilename gcj.info |
| @settitle Guide to GNU gcj |
| |
| @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 Programming |
| @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 |
| @author Tom Tromey |
| |
| @page |
| @vskip 0pt plus 1filll |
| For the @value{which-gcj} Version* |
| @sp 1 |
| Published by the Free Software Foundation @* |
| 59 Temple Place - Suite 330@* |
| Boston, MA 02111-1307, 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 |
| @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. |
| @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. |
| |
| @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 they can be automatically |
| loaded by the @code{libgcj} system classloader. 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. |
| @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 Java 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} 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 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-bite 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 Integer (int i) @{ this.i = i; @} |
| public static zero = new Integer(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{Jv_InitClass} 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 allocting 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}) |
| Here @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 |
| |
| |
| @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++ test.cc -lgcj}. |
| |
| @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 succint 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 name that was used to invoked the program. |
| |
| @item gnu.gcj.runtime.NameFinder.demangle |
| Whether names in a stack trace should be demangled. Defaults to @code{true}. |
| |
| @item gnu.gcj.runtime.NameFinder.sanitize |
| Whether calls to initialize exceptions and starting the runtime system |
| should be removed from the stack trace. Only done when names are |
| demangled. Defaults to @code{true}. |
| |
| @item gnu.gcj.runtime.NameFinder.remove_unknown |
| Whether calls to unknown functions (class and method names are unknown) |
| should be removed from the stack trace. Only done when the stack is |
| sanitized. Ignored if this means no stack trace information would be |
| available anymore. Defaults to @code{true}. |
| |
| @item gnu.gcj.runtime.NameFinder.remove_interpreter |
| Whether runtime interpreter calls (methods in the @code{_Jv_InterpMethod} class |
| and functions starting with @samp{ffi_}) should be removed from the stack |
| trace. Only done when the stack is sanitized. Defaults to @code{true}. |
| |
| |
| @item gnu.gcj.runtime.NameFinder.use_addr2line |
| Whether an external process (@command{addr2line} or @command{addr2name.awk}) |
| should be used as fallback to convert the addresses to function names when |
| the runtime is unable to do it through @code{dladdr}. |
| |
| @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} (the default), then any failed lookups are cached and not |
| tried again. If this property is set to @samp{never}, 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. |
| |
| @bye |