Merge from mainline (gomp-merge-2005-02-26).
[official-gcc.git] / gcc / java / gcj.texi
blobb270b6fbbcffab314a7639169cfcc3380b10e7aa
1 \input texinfo @c -*-texinfo-*-
2 @setfilename gcj.info
3 @settitle Guide to GNU gcj
5 @include gcc-common.texi
7 @c Note: When reading this manual you'll find lots of strange
8 @c circumlocutions like ``compiler for the Java language''.
9 @c This is necessary due to Sun's restrictions on the use of
10 @c the word ``Java'.
12 @c When this manual is copyrighted.
13 @set copyrights-gcj 2001, 2002, 2003, 2004, 2005
15 @c Versions
16 @set which-gcj GCC-@value{version-GCC}
18 @copying
19 @c man begin COPYRIGHT
20 Copyright @copyright{} @value{copyrights-gcj} Free Software Foundation, Inc.
22 Permission is granted to copy, distribute and/or modify this document
23 under the terms of the GNU Free Documentation License, Version 1.2 or
24 any later version published by the Free Software Foundation; with the
25 Invariant Sections being ``GNU General Public License'', the Front-Cover
26 texts being (a) (see below), and with the Back-Cover Texts being (b)
27 (see below).  A copy of the license is included in the
28 @c man end
29 section entitled
30 ``GNU Free Documentation License''.
31 @ignore
32 @c man begin COPYRIGHT
33 man page gfdl(7).
34 @c man end
35 @end ignore
37 @c man begin COPYRIGHT
39 (a) The FSF's Front-Cover Text is:
41      A GNU Manual
43 (b) The FSF's Back-Cover Text is:
45      You have freedom to copy and modify this GNU Manual, like GNU
46      software.  Copies published by the Free Software Foundation raise
47      funds for GNU development.
48 @c man end
49 @end copying
51 @ifinfo
52 @format
53 @dircategory Programming
54 @direntry
55 * Gcj: (gcj).               Ahead-of-time compiler for the Java language
56 @end direntry
58 @dircategory Individual utilities
59 @direntry
60 * gcjh: (gcj)Invoking gcjh.
61                             Generate header files from Java class files
62 * jv-scan: (gcj)Invoking jv-scan.
63                             Print information about Java source files
64 * jcf-dump: (gcj)Invoking jcf-dump.
65                             Print information about Java class files
66 * gij: (gcj)Invoking gij.   GNU interpreter for Java bytecode
67 * gcj-dbtool: (gcj)Invoking gcj-dbtool.
68                             Tool for manipulating class file databases.
69 * jv-convert: (gcj)Invoking jv-convert.
70                             Convert file from one encoding to another
71 * grmic: (gcj)Invoking grmic.
72                             Generate stubs for Remote Method Invocation.
73 * grmiregistry: (gcj)Invoking grmiregistry.
74                             The remote object registry.
75 @end direntry
76 @end format
78 @insertcopying
79 @end ifinfo
81 @titlepage
82 @title GNU gcj
83 @author Tom Tromey
85 @page
86 @vskip 0pt plus 1filll
87 For the @value{which-gcj} Version*
88 @sp 1
89 Published by the Free Software Foundation @*
90 59 Temple Place - Suite 330@*
91 Boston, MA 02111-1307, USA@*
92 @sp 1
93 @insertcopying
94 @end titlepage
95 @contents
96 @page
99 @node Top
100 @top Introduction
102 This manual describes how to use @command{gcj}, the GNU compiler for the
103 Java programming language.  @command{gcj} can generate both @file{.class}
104 files and object files, and it can read both Java source code and
105 @file{.class} files.
107 @menu
108 * Copying::              The GNU General Public License
109 * GNU Free Documentation License::
110                         How you can share and copy this manual
111 * Invoking gcj::        Compiler options supported by @command{gcj}
112 * Compatibility::       Compatibility between gcj and other tools for Java
113 * Invoking gcjh::       Generate header files from class files
114 * Invoking jv-scan::    Print information about source files
115 * Invoking jcf-dump::   Print information about class files
116 * Invoking gij::        Interpreting Java bytecodes
117 * Invoking gcj-dbtool:: Tool for manipulating class file databases.
118 * Invoking jv-convert:: Converting from one encoding to another
119 * Invoking grmic::      Generate stubs for Remote Method Invocation.
120 * Invoking grmiregistry:: The remote object registry.
121 * About CNI::           Description of the Compiled Native Interface
122 * System properties::   Modifying runtime behavior of the libgcj library
123 * Resources::           Where to look for more information
124 @end menu
127 @include gpl.texi
129 @include fdl.texi
132 @node Invoking gcj
133 @chapter Invoking gcj
135 @c man title gcj Ahead-of-time compiler for the Java language
137 @ignore
138 @c man begin SYNOPSIS gcj
139 gcj [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
140     [@option{--CLASSPATH}=@var{path}] [@option{--classpath}=@var{path}]
141     [@option{-f}@var{option}@dots{}] [@option{--encoding}=@var{name}]
142     [@option{--main}=@var{classname}] [@option{-D}@var{name}[=@var{value}]@dots{}]
143     [@option{-C}] [@option{--resource} @var{resource-name}] [@option{-d} @var{directory}]
144     [@option{-W}@var{warn}@dots{}]
145     @var{sourcefile}@dots{}
146 @c man end
147 @c man begin SEEALSO gcj
148 gcc(1), gcjh(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
149 and the Info entries for @file{gcj} and @file{gcc}.
150 @c man end
151 @end ignore
153 @c man begin DESCRIPTION gcj
155 As @command{gcj} is just another front end to @command{gcc}, it supports many
156 of the same options as gcc.  @xref{Option Summary, , Option Summary,
157 gcc, Using the GNU Compiler Collection (GCC)}.  This manual only documents the
158 options specific to @command{gcj}.
160 @c man end
162 @menu
163 * Input and output files::
164 * Input Options::               How gcj finds files
165 * Encodings::                   Options controlling source file encoding
166 * Warnings::                    Options controlling warnings specific to gcj
167 * Linking::                     Options for making an executable
168 * Code Generation::             Options controlling the output of gcj
169 * Configure-time Options::      Options you won't use
170 @end menu
172 @c man begin OPTIONS gcj
174 @node Input and output files
175 @section Input and output files
177 A @command{gcj} command is like a @command{gcc} command, in that it
178 consists of a number of options and file names.  The following kinds
179 of input file names are supported:
181 @table @gcctabopt
182 @item @var{file}.java
183 Java source files.
184 @item @var{file}.class
185 Java bytecode files.
186 @item @var{file}.zip
187 @itemx @var{file}.jar
188 An archive containing one or more @code{.class} files, all of
189 which are compiled.  The archive may be compressed.  Files in
190 an archive which don't end with @samp{.class} are treated as
191 resource files; they are compiled into the resulting object file
192 as @samp{core:} URLs.
193 @item @@@var{file}
194 A file containing a whitespace-separated list of input file names.
195 (Currently, these must all be @code{.java} source files, but that
196 may change.)
197 Each named file is compiled, just as if it had been on the command line.
198 @item @var{library}.a
199 @itemx @var{library}.so
200 @itemx -l@var{libname}
201 Libraries to use when linking.  See the @command{gcc} manual.
202 @end table
204 You can specify more than one input file on the @command{gcj} command line,
205 in which case they will all be compiled.  If you specify a
206 @code{-o @var{FILENAME}}
207 option, all the input files will be compiled together, producing a
208 single output file, named @var{FILENAME}.
209 This is allowed even when using @code{-S} or @code{-c},
210 but not when using @code{-C} or @code{--resource}.
211 (This is an extension beyond the what plain @command{gcc} allows.)
212 (If more than one input file is specified, all must currently
213 be @code{.java} files, though we hope to fix this.)
215 @node Input Options
216 @section Input Options
218 @cindex class path
220 @command{gcj} has options to control where it looks to find files it needs.
221 For instance, @command{gcj} might need to load a class that is referenced
222 by the file it has been asked to compile.  Like other compilers for the
223 Java language, @command{gcj} has a notion of a @dfn{class path}.  There are
224 several options and environment variables which can be used to
225 manipulate the class path.  When @command{gcj} looks for a given class, it
226 searches the class path looking for matching @file{.class} or
227 @file{.java} file.  @command{gcj} comes with a built-in class path which
228 points at the installed @file{libgcj.jar}, a file which contains all the
229 standard classes.
231 In the below, a directory or path component can refer either to an
232 actual directory on the filesystem, or to a @file{.zip} or @file{.jar}
233 file, which @command{gcj} will search as if it is a directory.
235 @table @gcctabopt
236 @item -I@var{dir}
237 All directories specified by @code{-I} are kept in order and prepended
238 to the class path constructed from all the other options.  Unless
239 compatibility with tools like @code{javac} is important, we recommend
240 always using @code{-I} instead of the other options for manipulating the
241 class path.
243 @item --classpath=@var{path}
244 This sets the class path to @var{path}, a colon-separated list of paths
245 (on Windows-based systems, a semicolon-separate list of paths).
246 This does not override the builtin (``boot'') search path.
248 @item --CLASSPATH=@var{path}
249 Deprecated synonym for @code{--classpath}.
251 @item --bootclasspath=@var{path}
252 Where to find the standard builtin classes, such as @code{java.lang.String}.
254 @item --extdirs=@var{path}
255 For each directory in the @var{path}, place the contents of that
256 directory at the end of the class path.
258 @item CLASSPATH
259 This is an environment variable which holds a list of paths.
260 @end table
262 The final class path is constructed like so:
264 @itemize @bullet
265 @item
266 First come all directories specified via @code{-I}.
268 @item
269 If @option{--classpath} is specified, its value is appended.
270 Otherwise, if the @code{CLASSPATH} environment variable is specified,
271 then its value is appended.
272 Otherwise, the current directory (@code{"."}) is appended.
274 @item
275 If @code{--bootclasspath} was specified, append its value.
276 Otherwise, append the built-in system directory, @file{libgcj.jar}.
278 @item
279 Finally, if @code{--extdirs} was specified, append the contents of the
280 specified directories at the end of the class path.  Otherwise, append
281 the contents of the built-in extdirs at @code{$(prefix)/share/java/ext}.
282 @end itemize
284 The classfile built by @command{gcj} for the class @code{java.lang.Object}
285 (and placed in @code{libgcj.jar}) contains a special zero length
286 attribute @code{gnu.gcj.gcj-compiled}. The compiler looks for this
287 attribute when loading @code{java.lang.Object} and will report an error
288 if it isn't found, unless it compiles to bytecode (the option
289 @code{-fforce-classes-archive-check} can be used to override this
290 behavior in this particular case.)
292 @table @gcctabopt
293 @item -fforce-classes-archive-check
294 This forces the compiler to always check for the special zero length
295 attribute @code{gnu.gcj.gcj-compiled} in @code{java.lang.Object} and
296 issue an error if it isn't found.
297 @end table
299 @node Encodings
300 @section Encodings
302 The Java programming language uses Unicode throughout.  In an effort to
303 integrate well with other locales, @command{gcj} allows @file{.java} files
304 to be written using almost any encoding.  @command{gcj} knows how to
305 convert these encodings into its internal encoding at compile time.
307 You can use the @code{--encoding=@var{NAME}} option to specify an
308 encoding (of a particular character set) to use for source files.  If
309 this is not specified, the default encoding comes from your current
310 locale.  If your host system has insufficient locale support, then
311 @command{gcj} assumes the default encoding to be the @samp{UTF-8} encoding
312 of Unicode.
314 To implement @code{--encoding}, @command{gcj} simply uses the host
315 platform's @code{iconv} conversion routine.  This means that in practice
316 @command{gcj} is limited by the capabilities of the host platform.
318 The names allowed for the argument @code{--encoding} vary from platform
319 to platform (since they are not standardized anywhere).  However,
320 @command{gcj} implements the encoding named @samp{UTF-8} internally, so if
321 you choose to use this for your source files you can be assured that it
322 will work on every host.
325 @node Warnings
326 @section Warnings
328 @command{gcj} implements several warnings.  As with other generic
329 @command{gcc} warnings, if an option of the form @code{-Wfoo} enables a
330 warning, then @code{-Wno-foo} will disable it.  Here we've chosen to
331 document the form of the warning which will have an effect -- the
332 default being the opposite of what is listed.
334 @table @gcctabopt
335 @item -Wredundant-modifiers
336 With this flag, @command{gcj} will warn about redundant modifiers.  For
337 instance, it will warn if an interface method is declared @code{public}.
339 @item -Wextraneous-semicolon
340 This causes @command{gcj} to warn about empty statements.  Empty statements
341 have been deprecated.
343 @item -Wno-out-of-date
344 This option will cause @command{gcj} not to warn when a source file is
345 newer than its matching class file.  By default @command{gcj} will warn
346 about this.
348 @item -Wno-deprecated
349 Warn if a deprecated class, method, or field is referred to.
351 @item -Wunused
352 This is the same as @command{gcc}'s @code{-Wunused}.
354 @item -Wall
355 This is the same as @code{-Wredundant-modifiers -Wextraneous-semicolon
356 -Wunused}.
357 @end table
360 @node Linking
361 @section Linking
363 To turn a Java application into an executable program,
364 you need to link it with the needed libraries, just as for C or C++.
365 The linker by default looks for a global function named @code{main}.
366 Since Java does not have global functions, and a
367 collection of Java classes may have more than one class with a
368 @code{main} method, you need to let the linker know which of those
369 @code{main} methods it should invoke when starting the application.
370 You can do that in any of these ways:
372 @itemize @bullet
373 @item
374 Specify the class containing the desired @code{main} method
375 when you link the application, using the @code{--main} flag,
376 described below.
377 @item
378 Link the Java package(s) into a shared library (dll) rather than an
379 executable.  Then invoke the application using the @code{gij} program,
380 making sure that @code{gij} can find the libraries it needs.
381 @item
382 Link the Java packages(s) with the flag @code{-lgij}, which links
383 in the @code{main} routine from the @code{gij} command.
384 This allows you to select the class whose @code{main} method you
385 want to run when you run the application.  You can also use
386 other @code{gij} flags, such as @code{-D} flags to set properties.
387 Using the @code{-lgij} library (rather than the @code{gij} program
388 of the previous mechanism) has some advantages: it is compatible with
389 static linking, and does not require configuring or installing libraries.
390 @end itemize
392 These @code{gij} options relate to linking an executable:
394 @table @gcctabopt
395 @item --main=@var{CLASSNAME}
396 This option is used when linking to specify the name of the class whose
397 @code{main} method should be invoked when the resulting executable is
398 run.
400 @item -D@var{name}[=@var{value}]
401 This option can only be used with @code{--main}.  It defines a system
402 property named @var{name} with value @var{value}.  If @var{value} is not
403 specified then it defaults to the empty string.  These system properties
404 are initialized at the program's startup and can be retrieved at runtime
405 using the @code{java.lang.System.getProperty} method.
407 @item -lgij
408 Create an application whose command-line processing is that
409 of the @code{gij} command.
411 This option is an alternative to using @code{--main}; you cannot use both.
412 @end table
414 @node Code Generation
415 @section Code Generation
417 In addition to the many @command{gcc} options controlling code generation,
418 @command{gcj} has several options specific to itself.
420 @table @gcctabopt
422 @item -C
423 This option is used to tell @command{gcj} to generate bytecode
424 (@file{.class} files) rather than object code.
426 @item --resource @var{resource-name}
427 This option is used to tell @command{gcj} to compile the contents of a
428 given file to object code so it may be accessed at runtime with the core
429 protocol handler as @samp{core:/@var{resource-name}}.  Note that
430 @var{resource-name} is the name of the resource as found at runtime; for
431 instance, it could be used in a call to @code{ResourceBundle.getBundle}.
432 The actual file name to be compiled this way must be specified
433 separately.
435 @item -d @var{directory}
436 When used with @code{-C}, this causes all generated @file{.class} files
437 to be put in the appropriate subdirectory of @var{directory}.  By
438 default they will be put in subdirectories of the current working
439 directory.
441 @item -fno-bounds-check
442 By default, @command{gcj} generates code which checks the bounds of all
443 array indexing operations.  With this option, these checks are omitted, which
444 can improve performance for code that uses arrays extensively.  Note that this 
445 can result in unpredictable behavior if the code in question actually does 
446 violate array bounds constraints.  It is safe to use this option if you are 
447 sure that your code will never throw an @code{ArrayIndexOutOfBoundsException}.
449 @item -fno-store-check
450 Don't generate array store checks.  When storing objects into arrays, a runtime
451 check is normally generated in order to ensure that the object is assignment
452 compatible with the component type of the array (which may not be known
453 at compile-time).  With this option, these checks are omitted.  This can 
454 improve performance for code which stores objects into arrays frequently.
455 It is safe to use this option if you are sure your code will never throw an 
456 @code{ArrayStoreException}.
458 @item -fjni
459 With @command{gcj} there are two options for writing native methods: CNI
460 and JNI@.  By default @command{gcj} assumes you are using CNI@.  If you are
461 compiling a class with native methods, and these methods are implemented
462 using JNI, then you must use @code{-fjni}.  This option causes
463 @command{gcj} to generate stubs which will invoke the underlying JNI
464 methods.
466 @item -fno-assert
467 Don't recognize the @code{assert} keyword.  This is for compatibility
468 with older versions of the language specification.
470 @item -fno-optimize-static-class-initialization
471 When the optimization level is greater or equal to @code{-O2},
472 @command{gcj} will try to optimize the way calls into the runtime are made
473 to initialize static classes upon their first use (this optimization
474 isn't carried out if @code{-C} was specified.) When compiling to native
475 code, @code{-fno-optimize-static-class-initialization} will turn this
476 optimization off, regardless of the optimization level in use.
478 @item --disable-assertions[=@var{class-or-package}]
479 Don't include code for checking assertions in the compiled code.
480 If @code{=@var{class-or-package}} is missing disables assertion code
481 generation for all classes, unless overridden by a more
482 specific @code{--enable-assertions} flag.
483 If @var{class-or-package} is a class name, only disables generating
484 assertion checks within the named class or its inner classes.
485 If @var{class-or-package} is a package name, disables generating
486 assertion checks within the named package or a subpackage.
488 By default, assertions are enabled when generating class files
489 or when not optimizing, and disabled when generating optimized binaries.
491 @item --enable-assertions[=@var{class-or-package}]
492 Generates code to check assertions.  The option is perhaps misnamed,
493 as you still need to turn on assertion checking at run-time,
494 and we don't support any easy way to do that.
495 So this flag isn't very useful yet, except to partially override
496 @code{--disable-assertions}.
498 @item -findirect-dispatch
499 @command{gcj} has a special binary compatibility ABI, which is enabled
500 by the @code{-findirect-dispatch} option.  In this mode, the code
501 generated by @command{gcj} honors the binary compatibility guarantees
502 in the Java Language Specification, and the resulting object files do
503 not need to be directly linked against their dependencies.  Instead,
504 all dependencies are looked up at runtime.  This allows free mixing of
505 interpreted and compiled code.
507 Note that, at present, @code{-findirect-dispatch} can only be used
508 when compiling @file{.class} files.  It will not work when compiling
509 from source.  CNI also does not yet work with the binary compatibility
510 ABI.  These restrictions will be lifted in some future release.
512 However, if you compile CNI code with the standard ABI, you can call
513 it from code built with the binary compatibility ABI.
515 @end table
518 @node Configure-time Options
519 @section Configure-time Options
521 Some @command{gcj} code generations options affect the resulting ABI, and
522 so can only be meaningfully given when @code{libgcj}, the runtime
523 package, is configured.  @code{libgcj} puts the appropriate options from
524 this group into a @samp{spec} file which is read by @command{gcj}.  These
525 options are listed here for completeness; if you are using @code{libgcj}
526 then you won't want to touch these options.
528 @table @gcctabopt
529 @item -fuse-boehm-gc
530 This enables the use of the Boehm GC bitmap marking code.  In particular
531 this causes @command{gcj} to put an object marking descriptor into each
532 vtable.
534 @item -fhash-synchronization
535 By default, synchronization data (the data used for @code{synchronize},
536 @code{wait}, and @code{notify}) is pointed to by a word in each object.
537 With this option @command{gcj} assumes that this information is stored in a
538 hash table and not in the object itself.
540 @item -fuse-divide-subroutine
541 On some systems, a library routine is called to perform integer
542 division.  This is required to get exception handling correct when
543 dividing by zero.
545 @item -fcheck-references
546 On some systems it's necessary to insert inline checks whenever
547 accessing an object via a reference.  On other systems you won't need
548 this because null pointer accesses are caught automatically by the
549 processor.
550 @end table
552 @c man end
554 @node Compatibility
555 @chapter Compatibility with the Java Platform
557 As we believe it is important that the Java platform not be fragmented,
558 @command{gcj} and @code{libgcj} try to conform to the relevant Java
559 specifications.  However, limited manpower and incomplete and unclear
560 documentation work against us.  So, there are caveats to using
561 @command{gcj}.
563 @menu
564 * Limitations::                 
565 * Extensions::                  
566 @end menu
568 @node Limitations
569 @section Standard features not yet supported
571 This list of compatibility issues is by no means complete.
573 @itemize @bullet
574 @item
575 @command{gcj} implements the JDK 1.2 language.  It supports inner classes
576 and the new 1.4 @code{assert} keyword.  It does not yet support the Java 2
577 @code{strictfp} keyword (it recognizes the keyword but ignores it).  
579 @item
580 @code{libgcj} is largely compatible with the JDK 1.2 libraries.
581 However, @code{libgcj} is missing many packages, most notably
582 @code{java.awt}.  There are also individual missing classes and methods.
583 We currently do not have a list showing differences between
584 @code{libgcj} and the Java 2 platform.
586 @item
587 Sometimes the @code{libgcj} implementation of a method or class differs
588 from the JDK implementation.  This is not always a bug.  Still, if it
589 affects you, it probably makes sense to report it so that we can discuss
590 the appropriate response.
592 @item
593 @command{gcj} does not currently allow for piecemeal replacement of
594 components within @code{libgcj}. Unfortunately, programmers often want
595 to use newer versions of certain packages, such as those provided by
596 the Apache Software Foundation's Jakarta project.  This has forced us
597 to place the @code{org.w3c.dom} and @code{org.xml.sax} packages into
598 their own libraries, separate from @code{libgcj}.  If you intend to
599 use these classes, you must link them explicitly with
600 @code{-l-org-w3c-dom} and @code{-l-org-xml-sax}.  Future versions of
601 @command{gcj} may not have this restriction.
602 @end itemize
604 @node Extensions
605 @section Extra features unique to gcj
607 The main feature of @command{gcj} is that it can compile programs written in
608 the Java programming language to native code.  Most extensions that have been
609 added are to facilitate this functionality.
611 @itemize @bullet
612 @item
613 @command{gcj} makes it easy and efficient to mix code written in Java and C++.
614 @xref{About CNI}, for more info on how to use this in your programs.
616 @item
617 When you compile your classes into a shared library they can be automatically
618 loaded by the @code{libgcj} system classloader.  When trying to load a class
619 @code{gnu.pkg.SomeClass} the system classloader will first try to load the
620 shared library @file{lib-gnu-pkg-SomeClass.so}, if that fails to load the
621 class then it will try to load @file{lib-gnu-pkg.so} and finally when the
622 class is still not loaded it will try to load @file{lib-gnu.so}.  Note that
623 all @samp{.}s will be transformed into @samp{-}s and that searching
624 for inner classes starts with their outermost outer class.  If the class
625 cannot be found this way the system classloader tries to use
626 the @code{libgcj} bytecode interpreter to load the class from the standard
627 classpath.  This process can be controlled to some degree via the
628 @code{gnu.gcj.runtime.VMClassLoader.library_control} property;
629 @xref{libgcj Runtime Properties}.
631 @item
632 @code{libgcj} includes a special @samp{gcjlib} URL type.  A URL of
633 this form is like a @code{jar} URL, and looks like
634 @samp{gcjlib:/path/to/shared/library.so!/path/to/resource}.  An access
635 to one of these URLs causes the shared library to be @code{dlopen()}d,
636 and then the resource is looked for in that library.  These URLs are
637 most useful when used in conjunction with @code{java.net.URLClassLoader}.
638 Note that, due to implementation limitations, currently any such URL
639 can be accessed by only one class loader, and libraries are never
640 unloaded.  This means some care must be exercised to make sure that
641 a @code{gcjlib} URL is not accessed by more than one class loader at once.
642 In a future release this limitation will be lifted, and such
643 libraries will be mapped privately.
645 @item
646 A program compiled by @command{gcj} will examine the
647 @env{GCJ_PROPERTIES} environment variable and change its behavior in
648 some ways.  In particular @env{GCJ_PROPERTIES} holds a list of
649 assignments to global properties, such as would be set with the
650 @option{-D} option to @command{java}.  For instance,
651 @samp{java.compiler=gcj} is a valid (but currently meaningless)
652 setting.
653 @cindex GCJ_PROPERTIES
654 @vindex GCJ_PROPERTIES
656 @end itemize
659 @node Invoking gcjh
660 @chapter Invoking gcjh
662 @c man title gcjh generate header files from Java class files
664 @c man begin DESCRIPTION gcjh
666 The @code{gcjh} program is used to generate header files from class
667 files.  It can generate both CNI and JNI header files, as well as stub
668 implementation files which can be used as a basis for implementing the
669 required native methods.
671 @c man end
673 @ignore
674 @c man begin SYNOPSIS gcjh
675 gcjh [@option{-stubs}] [@option{-jni}]
676     [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}]
677     [@option{-preprend} @var{text}]
678     [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
679     [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
680     [@option{-o} @var{file}] [@option{-td} @var{dir}]
681     [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}]
682     [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
683     @var{classname}@dots{}
684 @c man end
685 @c man begin SEEALSO gcjh
686 gcc(1), gcj(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
687 and the Info entries for @file{gcj} and @file{gcc}.
688 @c man end
689 @end ignore
691 @c man begin OPTIONS gcjh
693 @table @gcctabopt
694 @item -stubs
695 This causes @code{gcjh} to generate stub files instead of header files.
696 By default the stub file will be named after the class, with a suffix of
697 @samp{.cc}.  In JNI mode, the default output file will have the suffix
698 @samp{.c}.
700 @item -jni
701 This tells @code{gcjh} to generate a JNI header or stub.  By default,
702 CNI headers are generated.
704 @item -add @var{text}
705 Inserts @var{text} into the class body.  This is ignored in JNI mode.
707 @item -append @var{text}
708 Inserts @var{text} into the header file after the class declaration.
709 This is ignored in JNI mode.
711 @item -friend @var{text}
712 Inserts @var{text} into the class as a @code{friend} declaration.
713 This is ignored in JNI mode.
715 @item -prepend @var{text}
716 Inserts @var{text} into the header file before the class declaration.
717 This is ignored in JNI mode.
719 @item --classpath=@var{path}
720 @itemx --CLASSPATH=@var{path}
721 @itemx -I@var{directory}
722 @itemx -d @var{directory}
723 @itemx -o @var{file}
724 These options are all identical to the corresponding @command{gcj} options.
726 @item -o @var{file}
727 Sets the output file name.  This cannot be used if there is more than
728 one class on the command line.
730 @item -td @var{directory}
731 Sets the name of the directory to use for temporary files.
733 @item -M
734 Print all dependencies to stdout; suppress ordinary output.
736 @item -MM
737 Print non-system dependencies to stdout; suppress ordinary output.
739 @item -MD
740 Print all dependencies to stdout.
742 @item -MMD
743 Print non-system dependencies to stdout.
745 @item --help
746 Print help about @code{gcjh} and exit.  No further processing is done.
748 @item --version
749 Print version information for @code{gcjh} and exit.  No further
750 processing is done.
752 @item -v, --verbose
753 Print extra information while running.
754 @end table
756 All remaining options are considered to be names of classes.
758 @c man end
760 @node Invoking jv-scan
761 @chapter Invoking jv-scan
763 @c man title jv-scan print information about Java source file
765 @c man begin DESCRIPTION jv-scan
767 The @code{jv-scan} program can be used to print information about a Java
768 source file (@file{.java} file).
770 @c man end
772 @ignore
773 @c man begin SYNOPSIS jv-scan
774 jv-scan [@option{--no-assert}] [@option{--complexity}] 
775     [@option{--encoding}=@var{name}] [@option{--print-main}] 
776     [@option{--list-class}] [@option{--list-filename}]
777     [@option{--version}] [@option{--help}]
778     [@option{-o} @var{file}] @var{inputfile}@dots{}
779 @c man end
780 @c man begin SEEALSO jv-scan
781 gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
782 and the Info entries for @file{gcj} and @file{gcc}.
783 @c man end
784 @end ignore
786 @c man begin OPTIONS jv-scan
788 @table @gcctabopt
789 @item --no-assert
790 Don't recognize the @code{assert} keyword, for backwards compatibility
791 with older versions of the language specification.
793 @item --complexity
794 This prints a complexity measure, related to cyclomatic complexity, for
795 each input file.
797 @item --encoding=@var{name}
798 This works like the corresponding @command{gcj} option.
800 @item --print-main
801 This prints the name of the class in this file containing a @code{main}
802 method.
804 @item --list-class
805 This lists the names of all classes defined in the input files.
807 @item --list-filename
808 If @code{--list-class} is given, this option causes @code{jv-scan} to
809 also print the name of the file in which each class was found.
811 @item -o @var{file}
812 Print output to the named file.
814 @item --help
815 Print help, then exit.
817 @item --version
818 Print version number, then exit.
819 @end table
821 @c man end
823 @node Invoking jcf-dump
824 @chapter Invoking jcf-dump
826 @c man title jcf-dump print information about Java class files
828 @ignore
829 @c man begin SYNOPSIS jcf-dump
830 jcf-dump [@option{-c}] [@option{--javap}]
831     [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
832     [@option{-I}@var{dir}@dots{}] [@option{-o} @var{file}]
833     [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
834     @var{classname}@dots{}
835 @c man end
836 @c man begin SEEALSO jcf-dump
837 gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
838 and the Info entries for @file{gcj} and @file{gcc}.
839 @c man end
840 @end ignore
842 @c man begin DESCRIPTION jcf-dump
844 This is a class file examiner, similar to @code{javap}.  It will print
845 information about a number of classes, which are specified by class name
846 or file name.
848 @c man end
850 @c man begin OPTIONS jcf-dump
852 @table @gcctabopt
853 @item -c
854 Disassemble method bodies.  By default method bodies are not printed.
856 @item --print-constants
857 Print the constant pool.  When printing a reference to a constant
858 also print its index in the constant pool.
860 @item --javap
861 Generate output in @code{javap} format.  The implementation of this
862 feature is very incomplete.
864 @item --classpath=@var{path}
865 @itemx --CLASSPATH=@var{path}
866 @itemx -I@var{directory}
867 @itemx -o @var{file}
868 These options as the same as the corresponding @command{gcj} options.
870 @item --help
871 Print help, then exit.
873 @item --version
874 Print version number, then exit.
876 @item -v, --verbose
877 Print extra information while running.
878 Implies @code{--print-constants}.
879 @end table
881 @c man end
883 @node Invoking gij
884 @chapter Invoking gij
886 @c man title gij GNU interpreter for Java bytecode
888 @ignore
889 @c man begin SYNOPSIS gij
890 gij [@option{OPTION}] @dots{} @var{JARFILE} [@var{ARGS}@dots{}]
892 gij [@option{-jar}] [@option{OPTION}] @dots{} @var{CLASS} [@var{ARGS}@dots{}]
893   [@option{-cp} @var{path}] [@option{-classpath} @var{path}]
894   [@option{-D}@var{name}[=@var{value}]@dots{}]
895   [@option{-ms=}@var{number}] [@option{-mx=}@var{number}]
896   [@option{-X@var{argument}}] [@option{-verbose}] [@option{-verbose:class}]
897   [@option{--showversion}] [@option{--version}] [@option{--help}][@option{-?}]
898 @c man end
899 @c man begin SEEALSO gij
900 gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
901 and the Info entries for @file{gcj} and @file{gcc}.
902 @c man end
903 @end ignore
905 @c man begin DESCRIPTION gij
907 @code{gij} is a Java bytecode interpreter included with @code{libgcj}.
908 @code{gij} is not available on every platform; porting it requires a
909 small amount of assembly programming which has not been done for all the
910 targets supported by @command{gcj}.
912 The primary argument to @code{gij} is the name of a class or, with
913 @code{-jar}, a jar file.  Options before this argument are interpreted
914 by @code{gij}; remaining options are passed to the interpreted program.
916 If a class name is specified and this class does not have a @code{main}
917 method with the appropriate signature (a @code{static void} method with
918 a @code{String[]} as its sole argument), then @code{gij} will print an
919 error and exit.
921 If a jar file is specified then @code{gij} will use information in it to
922 determine which class' @code{main} method will be invoked.
924 @code{gij} will invoke the @code{main} method with all the remaining
925 command-line options.
927 Note that @code{gij} is not limited to interpreting code.  Because
928 @code{libgcj} includes a class loader which can dynamically load shared
929 objects, it is possible to give @code{gij} the name of a class which has
930 been compiled and put into a shared library on the class path.
932 @c man end
934 @c man begin OPTIONS gij
936 @table @gcctabopt
937 @item -cp @var{path}
938 @itemx -classpath @var{path}
939 Set the initial class path.  The class path is used for finding
940 class and resource files.  If specified, this option overrides the
941 @code{CLASSPATH} environment variable.  Note that this option is
942 ignored if @code{-jar} is used.
944 @item -D@var{name}[=@var{value}]
945 This defines a system property named @var{name} with value @var{value}.
946 If @var{value} is not specified then it defaults to the empty string.
947 These system properties are initialized at the program's startup and can
948 be retrieved at runtime using the @code{java.lang.System.getProperty}
949 method.
951 @item -ms=@var{number}
952 This sets the initial heap size.
954 @item -mx=@var{number}
955 This sets the maximum heap size.
957 @item -X
958 @itemx -X@var{argument}
959 Supplying @code{-X} by itself will cause @code{gij} to list all the
960 supported @code{-X} options.  Currently there are none.  Unrecognized
961 @code{-X} options are ignored, for compatibility with other runtimes.
963 @item -jar
964 This indicates that the name passed to @code{gij} should be interpreted
965 as the name of a jar file, not a class.
967 @item --help
968 @itemx -?
969 Print help, then exit.
971 @item --showversion
972 Print version number and continue.
974 @item --version
975 Print version number, then exit.
977 @item -verbose
978 @itemx -verbose:class
979 Each time a class is initialized, print a short message on standard error.
980 @end table
982 @c man end
984 @node Invoking gcj-dbtool
985 @chapter Invoking gcj-dbtool.
987 @c man title gcj-dbtool Manipulate class file mapping databases for libgcj
989 @ignore
990 @c man begin SYNOPSIS gcj-dbtool
991 gcj-dbtool @option{OPTION} @var{DBFILE} [@option{MORE}] @dots{}
993 gcj-dbtool [@option{-n}] [@option{-a}] [@option{-t}] [@option{-l}]
994   [@option{-v}] [@option{--version}] [@option{--help}]
996 @c man end
997 @c man begin SEEALSO gij
998 gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
999 and the Info entries for @file{gcj} and @file{gcc}.
1000 @c man end
1001 @end ignore
1003 @c man begin DESCRIPTION gcj-dbtool
1005 @code{gcj-dbtool} is a tool for creating and manipulating class file
1006 mapping databases.  @code{libgcj} can use these databases to find a
1007 shared library corresponding to the bytecode representation of a
1008 class.  This functionality is useful for ahead-of-time compilation of
1009 a program that has no knowledge of @code{gcj}.
1011 @code{gcj-dbtool} works best if all the jar files added to it are
1012 compiled using @code{-findirect-dispatch}.
1014 Note that @code{gcj-dbtool} is currently available as ``preview
1015 technology''.  We believe it is a reasonable way to allow
1016 application-transparent ahead-of-time compilation, but this is an
1017 unexplored area.  We welcome your comments.
1019 @c man end
1021 @c man begin OPTIONS gcj-dbtool
1023 @table @gcctabopt
1024 @item -n @var{DBFILE} [@var{SIZE}]
1025 This creates a new database.  Currently, databases cannot be resized;
1026 you can choose a larger initial size if desired.  The default size is
1027 32,749.
1029 @item -a @var{DBFILE} @var{JARFILE} @var{LIB}
1030 This adds a jar file to the database.  For each class file in the jar,
1031 a cryptographic signature of the bytecode representation of the class
1032 is recorded in the database.  At runtime, a class is looked up by its
1033 signature and the compiled form of the class is looked for in the
1034 corresponding shared library.
1036 @item -t @var{DBFILE}
1037 Test a database.
1039 @item -l @var{DBFILE}
1040 List the contents of a database.
1042 @item --help
1043 Print a help message, then exit.
1045 @item --version
1046 @itemx -v
1047 Print version information, then exit.
1049 @end table
1051 @c man end
1053 @node Invoking jv-convert
1054 @chapter Invoking jv-convert
1056 @c man title jv-convert Convert file from one encoding to another
1058 @c man begin SYNOPSIS jv-convert
1059 @command{jv-convert} [@option{OPTION}] @dots{} [@var{INPUTFILE} [@var{OUTPUTFILE}]]
1060 @ignore
1062   [@option{--encoding} @var{name}]
1063   [@option{--from} @var{name}]
1064   [@option{--to} @var{name}]
1065   [@option{-i} @var{file}] [@option{-o} @var{file}]
1066   [@option{--reverse}] [@option{--help}] [@option{--version}]
1067 @end ignore
1068 @c man end
1070 @c man begin DESCRIPTION jv-convert
1072 @command{jv-convert} is a utility included with @code{libgcj} which
1073 converts a file from one encoding to another.  It is similar to the Unix
1074 @command{iconv} utility.
1076 The encodings supported by @command{jv-convert} are platform-dependent.
1077 Currently there is no way to get a list of all supported encodings.
1079 @c man end
1081 @c man begin OPTIONS jv-convert
1083 @table @gcctabopt
1084 @item --encoding @var{name}
1085 @itemx --from @var{name}
1086 Use @var{name} as the input encoding.  The default is the current
1087 locale's encoding.
1089 @item --to @var{name}
1090 Use @var{name} as the output encoding.  The default is the
1091 @code{JavaSrc} encoding; this is ASCII with @samp{\u} escapes for
1092 non-ASCII characters.
1094 @item -i @var{file}
1095 Read from @var{file}.  The default is to read from standard input.
1097 @item -o @var{file}
1098 Write to @var{file}.  The default is to write to standard output.
1100 @item --reverse
1101 Swap the input and output encodings.
1103 @item --help
1104 Print a help message, then exit.
1106 @item --version
1107 Print version information, then exit.
1108 @end table
1110 @c man end
1112 @node Invoking grmic
1113 @chapter Invoking grmic
1115 @c man title grmic Generate stubs for Remote Method Invocation
1117 @c man begin SYNOPSIS grmic
1118 @command{grmic} [@option{OPTION}] @dots{} @var{class} @dots{}
1119 @ignore
1120   [@option{-keep}]
1121   [@option{-keepgenerated}]
1122   [@option{-v1.1}]
1123   [@option{-vcompat}]
1124   [@option{-v1.2}]
1125   [@option{-nocompile}]
1126   [@option{-verbose}]
1127   [@option{-d} @var{directory}]
1128   [@option{-help}]
1129   [@option{-version}]
1130 @end ignore
1131 @c man end
1133 @c man begin DESCRIPTION grmic
1135 @command{grmic} is a utility included with @code{libgcj} which generates
1136 stubs for remote objects.
1138 @c FIXME: Add real information here.
1139 @c This really isn't much more than the --help output.
1141 Note that this program isn't yet fully compatible with the JDK
1142 @command{grmic}.  Some options, such as @option{-classpath}, are
1143 recognized but currently ignored.  We have left these options
1144 undocumented for now.
1146 Long options can also be given with a GNU-style leading @samp{--}.  For
1147 instance, @option{--help} is accepted.
1149 @c man end
1151 @c man begin OPTIONS grmic
1153 @table @gcctabopt
1154 @item -keep
1155 @itemx -keepgenerated
1156 By default, @command{grmic} deletes intermediate files.  Either of these
1157 options causes it not to delete such files.
1159 @item -v1.1
1160 Cause @command{grmic} to create stubs and skeletons for the 1.1
1161 protocol version.
1163 @item -vcompat
1164 Cause @command{grmic} to create stubs and skeletons compatible with both
1165 the 1.1 and 1.2 protocol versions.  This is the default.
1167 @item -v1.2
1168 Cause @command{grmic} to create stubs and skeletons for the 1.2
1169 protocol version.
1171 @item -nocompile
1172 Don't compile the generated files.
1174 @item -verbose
1175 Print information about what @command{grmic} is doing.
1177 @item -d @var{directory}
1178 Put output files in @var{directory}.  By default the files are put in
1179 the current working directory.
1181 @item -help
1182 Print a help message, then exit.
1184 @item -version
1185 Print version information, then exit.
1186 @end table
1188 @c man end
1191 @node Invoking grmiregistry
1192 @chapter Invoking grmiregistry
1194 @c man title grmiregistry Remote object registry
1196 @c man begin SYNOPSIS grmiregistry
1197 @command{grmic} [@option{OPTION}] @dots{} [@var{port}]
1198 @ignore
1199   [@option{--help}]
1200   [@option{--version}]
1201 @end ignore
1202 @c man end
1204 @c man begin DESCRIPTION grmiregistry
1206 @command{grmiregistry} starts a remote object registry on the current
1207 host.  If no port number is specified, then port 1099 is used.
1209 @c FIXME: Add real information here.
1210 @c This really isn't much more than the --help output.
1212 @c man end
1214 @c man begin OPTIONS grmiregistry
1216 @table @gcctabopt
1217 @item --help
1218 Print a help message, then exit.
1220 @item --version
1221 Print version information, then exit.
1222 @end table
1224 @c man end
1227 @node About CNI
1228 @chapter About CNI
1230 This documents CNI, the Compiled Native Interface,
1231 which is is a convenient way to write Java native methods using C++.
1232 This is a more efficient, more convenient, but less portable
1233 alternative to the standard JNI (Java Native Interface).
1235 @menu
1236 * Basic concepts::              Introduction to using CNI@.
1237 * Packages::                    How packages are mapped to C++.
1238 * Primitive types::             Handling Java types in C++.
1239 * Interfaces::                  How Java interfaces map to C++.
1240 * Objects and Classes::         C++ and Java classes.
1241 * Class Initialization::        How objects are initialized.
1242 * Object allocation::           How to create Java objects in C++.
1243 * Arrays::                      Dealing with Java arrays in C++.
1244 * Methods::                     Java methods in C++.
1245 * Strings::                     Information about Java Strings.
1246 * Mixing with C++::             How CNI can interoperate with C++.
1247 * Exception Handling::          How exceptions are handled.
1248 * Synchronization::             Synchronizing between Java and C++.
1249 * Invocation::                  Starting the Java runtime from C++.
1250 * Reflection::                  Using reflection from C++.
1251 @end menu
1254 @node Basic concepts
1255 @section Basic concepts
1257 In terms of languages features, Java is mostly a subset
1258 of C++.  Java has a few important extensions, plus a powerful standard
1259 class library, but on the whole that does not change the basic similarity.
1260 Java is a hybrid object-oriented language, with a few native types,
1261 in addition to class types.  It is class-based, where a class may have
1262 static as well as per-object fields, and static as well as instance methods.
1263 Non-static methods may be virtual, and may be overloaded.  Overloading is
1264 resolved at compile time by matching the actual argument types against
1265 the parameter types.  Virtual methods are implemented using indirect calls
1266 through a dispatch table (virtual function table).  Objects are
1267 allocated on the heap, and initialized using a constructor method.
1268 Classes are organized in a package hierarchy.
1270 All of the listed attributes are also true of C++, though C++ has
1271 extra features (for example in C++ objects may be allocated not just
1272 on the heap, but also statically or in a local stack frame).  Because
1273 @command{gcj} uses the same compiler technology as G++ (the GNU
1274 C++ compiler), it is possible to make the intersection of the two
1275 languages use the same ABI (object representation and calling
1276 conventions).  The key idea in CNI is that Java objects are C++
1277 objects, and all Java classes are C++ classes (but not the other way
1278 around).  So the most important task in integrating Java and C++ is to
1279 remove gratuitous incompatibilities.
1281 You write CNI code as a regular C++ source file.  (You do have to use
1282 a Java/CNI-aware C++ compiler, specifically a recent version of G++.)
1284 @noindent A CNI C++ source file must have:
1286 @example
1287 #include <gcj/cni.h>
1288 @end example
1290 @noindent and then must include one header file for each Java class it uses, e.g.:
1292 @example
1293 #include <java/lang/Character.h>
1294 #include <java/util/Date.h>
1295 #include <java/lang/IndexOutOfBoundsException.h>
1296 @end example
1298 @noindent These header files are automatically generated by @code{gcjh}.
1301 CNI provides some functions and macros to make using Java objects and
1302 primitive types from C++ easier.  In general, these CNI functions and
1303 macros start with the @code{Jv} prefix, for example the function
1304 @code{JvNewObjectArray}.  This convention is used to avoid conflicts
1305 with other libraries.  Internal functions in CNI start with the prefix
1306 @code{_Jv_}.  You should not call these; if you find a need to, let us
1307 know and we will try to come up with an alternate solution.
1310 @subsection Limitations
1312 Whilst a Java class is just a C++ class that doesn't mean that you are
1313 freed from the shackles of Java, a @acronym{CNI} C++ class must adhere to the
1314 rules of the Java programming language.
1316 For example: it is not possible to declare a method in a CNI class
1317 that will take a C string (@code{char*}) as an argument, or to declare a
1318 member variable of some non-Java datatype.
1321 @node Packages
1322 @section Packages
1324 The only global names in Java are class names, and packages.  A
1325 @dfn{package} can contain zero or more classes, and also zero or more
1326 sub-packages.  Every class belongs to either an unnamed package or a
1327 package that has a hierarchical and globally unique name.
1329 A Java package is mapped to a C++ @dfn{namespace}.  The Java class
1330 @code{java.lang.String} is in the package @code{java.lang}, which is a
1331 sub-package of @code{java}.  The C++ equivalent is the class
1332 @code{java::lang::String}, which is in the namespace @code{java::lang}
1333 which is in the namespace @code{java}.
1335 @noindent Here is how you could express this:
1337 @example
1338 (// @r{Declare the class(es), possibly in a header file:}
1339 namespace java @{
1340   namespace lang @{
1341     class Object;
1342     class String;
1343     ...
1344   @}
1347 class java::lang::String : public java::lang::Object
1349   ...
1351 @end example
1353 @noindent The @code{gcjh} tool automatically generates the necessary namespace
1354 declarations.
1357 @subsection Leaving out package names
1359 Always using the fully-qualified name of a java class can be
1360 tiresomely verbose.  Using the full qualified name also ties the code
1361 to a single package making code changes necessary should the class
1362 move from one package to another.  The Java @code{package} declaration
1363 specifies that the following class declarations are in the named
1364 package, without having to explicitly name the full package
1365 qualifiers.  The @code{package} declaration can be
1366 followed by zero or more @code{import} declarations, which
1367 allows either a single class or all the classes in a package to be
1368 named by a simple identifier.  C++ provides something similar with the
1369 @code{using} declaration and directive.
1371 @noindent In Java:
1373 @example
1374 import @var{package-name}.@var{class-name};
1375 @end example
1377 @noindent allows the program text to refer to @var{class-name} as a shorthand for 
1378 the fully qualified name: @code{@var{package-name}.@var{class-name}}.
1381 @noindent To achieve the same effect C++, you have to do this:
1383 @example
1384 using @var{package-name}::@var{class-name};
1385 @end example
1388 @noindent Java can also cause imports on demand, like this:
1390 @example
1391 import @var{package-name}.*;
1392 @end example
1394 @noindent Doing this allows any class from the package @var{package-name} to be
1395 referred to only by its class-name within the program text.
1398 @noindent The same effect can be achieved in C++ like this:
1400 @example
1401 using namespace @var{package-name};
1402 @end example
1405 @node Primitive types
1406 @section Primitive types
1408 Java provides 8 @dfn{primitives} types which represent integers, floats, 
1409 characters and booleans (and also the void type).  C++ has its own
1410 very similar concrete types.  Such types in C++ however are not always
1411 implemented in the same way (an int might be 16, 32 or 64 bits for example) 
1412 so CNI provides a special C++ type for each primitive Java type:
1414 @multitable @columnfractions .20 .25 .60
1415 @item @strong{Java type}   @tab @strong{C/C++ typename} @tab @strong{Description}
1416 @item @code{char}        @tab @code{jchar}          @tab 16 bit Unicode character
1417 @item @code{boolean}     @tab @code{jboolean}       @tab logical (true or false) values
1418 @item @code{byte}        @tab @code{jbyte}          @tab 8-bit signed integer
1419 @item @code{short}       @tab @code{jshort}         @tab 16 bit signed integer
1420 @item @code{int}         @tab @code{jint}           @tab 32 bit signed integer
1421 @item @code{long}        @tab @code{jlong}          @tab 64 bit signed integer
1422 @item @code{float}       @tab @code{jfloat}         @tab 32 bit IEEE floating point number
1423 @item @code{double}      @tab @code{jdouble}        @tab 64 bit IEEE floating point number
1424 @item @code{void}        @tab @code{void}           @tab no value
1425 @end multitable
1427 When referring to a Java type You should always use these C++ typenames (e.g.: @code{jint})
1428 to avoid disappointment.
1431 @subsection Reference types associated with primitive types
1433 In Java each primitive type has an associated reference type, 
1434 e.g.: @code{boolean} has an associated @code{java.lang.Boolean} class.
1435 In order to make working with such classes easier GCJ provides the macro
1436 @code{JvPrimClass}:
1438 @deffn macro JvPrimClass type
1439 Return a pointer to the @code{Class} object corresponding to the type supplied.
1441 @example
1442 JvPrimClass(void) @result{} java.lang.Void.TYPE
1443 @end example
1445 @end deffn
1448 @node Interfaces
1449 @section Interfaces
1451 A Java class can @dfn{implement} zero or more
1452 @dfn{interfaces}, in addition to inheriting from
1453 a single base class. 
1455 @acronym{CNI} allows CNI code to implement methods of interfaces.
1456 You can also call methods through interface references, with some
1457 limitations.
1459 @acronym{CNI} doesn't understand interface inheritance at all yet.  So,
1460 you can only call an interface method when the declared type of the
1461 field being called matches the interface which declares that
1462 method.  The workaround is to cast the interface reference to the right
1463 superinterface.
1465 For example if you have: 
1467 @example 
1468 interface A 
1469 @{ 
1470   void a(); 
1471 @} 
1473 interface B extends A 
1474 @{ 
1475   void b(); 
1476 @} 
1477 @end example
1479 and declare a variable of type @code{B} in C++, you can't call
1480 @code{a()} unless you cast it to an @code{A} first.
1482 @node Objects and Classes
1483 @section Objects and Classes
1485 @subsection Classes
1487 All Java classes are derived from @code{java.lang.Object}.  C++ does
1488 not have a unique root class, but we use the C++ class
1489 @code{java::lang::Object} as the C++ version of the
1490 @code{java.lang.Object} Java class.  All other Java classes are mapped
1491 into corresponding C++ classes derived from @code{java::lang::Object}.
1493 Interface inheritance (the @code{implements} keyword) is currently not
1494 reflected in the C++ mapping.
1497 @subsection Object fields
1499 Each object contains an object header, followed by the instance fields
1500 of the class, in order.  The object header consists of a single
1501 pointer to a dispatch or virtual function table.  (There may be extra
1502 fields @emph{in front of} the object, for example for memory
1503 management, but this is invisible to the application, and the
1504 reference to the object points to the dispatch table pointer.)
1506 The fields are laid out in the same order, alignment, and size as in
1507 C++.  Specifically, 8-bite and 16-bit native types (@code{byte},
1508 @code{short}, @code{char}, and @code{boolean}) are @emph{not} widened
1509 to 32 bits.  Note that the Java VM does extend 8-bit and 16-bit types
1510 to 32 bits when on the VM stack or temporary registers.
1512 If you include the @code{gcjh}-generated header for a
1513 class, you can access fields of Java classes in the @emph{natural}
1514 way.  For example, given the following Java class:
1516 @example
1517 public class Int
1519   public int i;
1520   public Integer (int i) @{ this.i = i; @}
1521   public static zero = new Integer(0);
1523 @end example
1525 you can write:
1527 @example
1528 #include <gcj/cni.h>;
1529 #include <Int>;
1531 Int*
1532 mult (Int *p, jint k)
1534   if (k == 0)
1535     return Int::zero;  // @r{Static member access.}
1536   return new Int(p->i * k);
1538 @end example
1541 @subsection Access specifiers
1543 CNI does not strictly enforce the Java access
1544 specifiers, because Java permissions cannot be directly mapped
1545 into C++ permission.  Private Java fields and methods are mapped
1546 to private C++ fields and methods, but other fields and methods
1547 are mapped to public fields and methods.
1551 @node Class Initialization
1552 @section Class Initialization
1554 Java requires that each class be automatically initialized at the time 
1555 of the first active use.  Initializing a class involves 
1556 initializing the static fields, running code in class initializer 
1557 methods, and initializing base classes.  There may also be 
1558 some implementation specific actions, such as allocating 
1559 @code{String} objects corresponding to string literals in
1560 the code.
1562 The GCJ compiler inserts calls to @code{JvInitClass} at appropriate
1563 places to ensure that a class is initialized when required.  The C++
1564 compiler does not insert these calls automatically---it is the
1565 programmer's responsibility to make sure classes are initialized.
1566 However, this is fairly painless because of the conventions assumed by
1567 the Java system.
1569 First, @code{libgcj} will make sure a class is initialized before an
1570 instance of that object is created.  This is one of the
1571 responsibilities of the @code{new} operation.  This is taken care of
1572 both in Java code, and in C++ code.  When G++ sees a @code{new} of a
1573 Java class, it will call a routine in @code{libgcj} to allocate the
1574 object, and that routine will take care of initializing the class.
1575 Note however that this does not happen for Java arrays; you must
1576 allocate those using the appropriate CNI function.  It follows that
1577 you can access an instance field, or call an instance (non-static)
1578 method and be safe in the knowledge that the class and all of its base
1579 classes have been initialized.
1581 Invoking a static method is also safe.  This is because the
1582 Java compiler adds code to the start of a static method to make sure
1583 the class is initialized.  However, the C++ compiler does not
1584 add this extra code.  Hence, if you write a native static method
1585 using CNI, you are responsible for calling @code{JvInitClass}
1586 before doing anything else in the method (unless you are sure
1587 it is safe to leave it out).
1589 Accessing a static field also requires the class of the
1590 field to be initialized.  The Java compiler will generate code
1591 to call @code{Jv_InitClass} before getting or setting the field.
1592 However, the C++ compiler will not generate this extra code,
1593 so it is your responsibility to make sure the class is
1594 initialized before you access a static field from C++.
1597 @node Object allocation
1598 @section Object allocation
1600 New Java objects are allocated using a
1601 @dfn{class instance creation expression}, e.g.:
1603 @example
1604 new @var{Type} ( ... )
1605 @end example
1607 The same syntax is used in C++.  The main difference is that
1608 C++ objects have to be explicitly deleted; in Java they are
1609 automatically deleted by the garbage collector.
1610 Using @acronym{CNI}, you can allocate a new Java object
1611 using standard C++ syntax and the C++ compiler will allocate
1612 memory from the garbage collector.  If you have overloaded
1613 constructors, the compiler will choose the correct one
1614 using standard C++ overload resolution rules.  
1616 @noindent For example:
1618 @example
1619 java::util::Hashtable *ht = new java::util::Hashtable(120);
1620 @end example
1623 @node Arrays
1624 @section Arrays
1626 While in many ways Java is similar to C and C++, it is quite different
1627 in its treatment of arrays.  C arrays are based on the idea of pointer
1628 arithmetic, which would be incompatible with Java's security
1629 requirements.  Java arrays are true objects (array types inherit from
1630 @code{java.lang.Object}).  An array-valued variable is one that
1631 contains a reference (pointer) to an array object.
1633 Referencing a Java array in C++ code is done using the
1634 @code{JArray} template, which as defined as follows:
1636 @example
1637 class __JArray : public java::lang::Object
1639 public:
1640   int length;
1643 template<class T>
1644 class JArray : public __JArray
1646   T data[0];
1647 public:
1648   T& operator[](jint i) @{ return data[i]; @}
1650 @end example
1653 There are a number of @code{typedef}s which correspond to @code{typedef}s 
1654 from the @acronym{JNI}.  Each is the type of an array holding objects
1655 of the relevant type:
1657 @example
1658 typedef __JArray *jarray;
1659 typedef JArray<jobject> *jobjectArray;
1660 typedef JArray<jboolean> *jbooleanArray;
1661 typedef JArray<jbyte> *jbyteArray;
1662 typedef JArray<jchar> *jcharArray;
1663 typedef JArray<jshort> *jshortArray;
1664 typedef JArray<jint> *jintArray;
1665 typedef JArray<jlong> *jlongArray;
1666 typedef JArray<jfloat> *jfloatArray;
1667 typedef JArray<jdouble> *jdoubleArray;
1668 @end example
1671 @deftypemethod {template<class T>} T* elements (JArray<T> @var{array})
1672 This template function can be used to get a pointer to the elements of
1673 the @code{array}.  For instance, you can fetch a pointer to the
1674 integers that make up an @code{int[]} like so:
1676 @example
1677 extern jintArray foo;
1678 jint *intp = elements (foo);
1679 @end example
1681 The name of this function may change in the future.
1682 @end deftypemethod
1685 @deftypefun jobjectArray JvNewObjectArray (jsize @var{length}, jclass @var{klass}, jobject @var{init})
1686 Here @code{klass} is the type of elements of the array and
1687 @code{init} is the initial value put into every slot in the array.
1688 @end deftypefun
1691 @subsection Creating arrays
1693 For each primitive type there is a function which can be used to
1694 create a new array of that type.  The name of the function is of the
1695 form:
1697 @example
1698 JvNew@var{Type}Array
1699 @end example
1701 @noindent For example:
1703 @example
1704 JvNewBooleanArray
1705 @end example
1707 @noindent can be used to create an array of Java primitive boolean types.
1709 @noindent The following function definition is the template for all such functions:
1711 @deftypefun jbooleanArray JvNewBooleanArray (jint @var{length})
1712 Create's an array @var{length} indices long.
1713 @end deftypefun
1715 @deftypefun jsize JvGetArrayLength (jarray @var{array})
1716 Returns the length of the @var{array}.
1717 @end deftypefun
1720 @node Methods
1721 @section Methods
1723 Java methods are mapped directly into C++ methods.
1724 The header files generated by @code{gcjh}
1725 include the appropriate method definitions.
1726 Basically, the generated methods have the same names and
1727 @emph{corresponding} types as the Java methods,
1728 and are called in the natural manner.
1730 @subsection Overloading
1732 Both Java and C++ provide method overloading, where multiple
1733 methods in a class have the same name, and the correct one is chosen
1734 (at compile time) depending on the argument types.
1735 The rules for choosing the correct method are (as expected) more complicated
1736 in C++ than in Java, but given a set of overloaded methods
1737 generated by @code{gcjh} the C++ compiler will choose
1738 the expected one.
1740 Common assemblers and linkers are not aware of C++ overloading,
1741 so the standard implementation strategy is to encode the
1742 parameter types of a method into its assembly-level name.
1743 This encoding is called @dfn{mangling},
1744 and the encoded name is the @dfn{mangled name}.
1745 The same mechanism is used to implement Java overloading.
1746 For C++/Java interoperability, it is important that both the Java
1747 and C++ compilers use the @emph{same} encoding scheme.
1749 @subsection Static methods
1751 Static Java methods are invoked in @acronym{CNI} using the standard
1752 C++ syntax, using the @code{::} operator rather
1753 than the @code{.} operator.  
1755 @noindent For example:
1757 @example
1758 jint i = java::lang::Math::round((jfloat) 2.3);
1759 @end example
1761 @noindent C++ method definition syntax is used to define a static native method.
1762 For example:
1764 @example
1765 #include <java/lang/Integer>
1766 java::lang::Integer*
1767 java::lang::Integer::getInteger(jstring str)
1769   ...
1771 @end example
1774 @subsection Object Constructors
1776 Constructors are called implicitly as part of object allocation
1777 using the @code{new} operator.  
1779 @noindent For example:
1781 @example
1782 java::lang::Integer *x = new java::lang::Integer(234);
1783 @end example
1785 Java does not allow a constructor to be a native method.
1786 This limitation can be coded round however because a constructor
1787 can @emph{call} a native method.
1790 @subsection Instance methods
1792 Calling a Java instance method from a C++ @acronym{CNI} method is done 
1793 using the standard C++ syntax, e.g.:
1795 @example
1796 // @r{First create the Java object.}
1797 java::lang::Integer *x = new java::lang::Integer(234);
1798 // @r{Now call a method.}
1799 jint prim_value = x->intValue();
1800 if (x->longValue == 0) 
1801   ...
1802 @end example
1804 @noindent Defining a Java native instance method is also done the natural way:
1806 @example
1807 #include <java/lang/Integer.h>
1809 jdouble
1810 java::lang:Integer::doubleValue()
1812   return (jdouble) value;
1814 @end example
1817 @subsection Interface methods
1819 In Java you can call a method using an interface reference.  This is
1820 supported, but not completely.  @xref{Interfaces}.
1825 @node Strings
1826 @section Strings
1828 @acronym{CNI} provides a number of utility functions for
1829 working with Java Java @code{String} objects.
1830 The names and interfaces are analogous to those of @acronym{JNI}.
1833 @deftypefun jstring JvNewString (const char* @var{chars}, jsize @var{len})
1834 Returns a Java @code{String} object with characters from the C string
1835 @var{chars} up to the index @var{len} in that array.
1836 @end deftypefun
1838 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}, jsize @var{len})
1839 Returns a Java @code{String} made up of @var{len} bytes from @var{bytes}.
1840 @end deftypefun
1843 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes})
1844 As above but the length of the @code{String} is @code{strlen(@var{bytes})}.
1845 @end deftypefun
1847 @deftypefun jstring JvNewStringUTF (const char* @var{bytes})
1848 Returns a @code{String} which is made up of the UTF encoded characters
1849 present in the C string @var{bytes}.
1850 @end deftypefun
1852 @deftypefun jchar* JvGetStringChars (jstring @var{str})
1853 Returns a pointer to an array of characters making up the @code{String} @var{str}.
1854 @end deftypefun
1856 @deftypefun int JvGetStringUTFLength (jstring @var{str})
1857 Returns the number of bytes required to encode the contents of the
1858 @code{String} @var{str} in UTF-8.
1859 @end deftypefun
1861 @deftypefun jsize JvGetStringUTFRegion (jstring @var{str}, jsize @var{start}, jsize @var{len}, char* @var{buf})
1862 Puts the UTF-8 encoding of a region of the @code{String} @var{str} into 
1863 the buffer @code{buf}.  The region to fetch is marked by @var{start} and @var{len}.
1865 Note that @var{buf} is a buffer, not a C string.  It is @emph{not} 
1866 null terminated.
1867 @end deftypefun
1870 @node Mixing with C++
1871 @section Interoperating with C/C++
1873 Because @acronym{CNI} is designed to represent Java classes and methods it
1874 cannot be mixed readily with C/C++ types.
1876 One important restriction is that Java classes cannot have non-Java
1877 type instance or static variables and cannot have methods which take
1878 non-Java types as arguments or return non-Java types.
1880 @noindent None of the following is possible with CNI:
1882 @example
1884 class ::MyClass : public java::lang::Object
1886    char* variable;  // @r{char* is not a valid Java type.}
1890 uint
1891 ::SomeClass::someMethod (char *arg)
1893   .
1894   .
1895   .
1896 @}   // @r{@code{uint} is not a valid Java type, neither is @code{char*}}
1897 @end example
1899 @noindent Of course, it is ok to use C/C++ types within the scope of a method:
1902 @example
1903 jint
1904 ::SomeClass::otherMethod (jstring str)
1906    char *arg = ...
1907    .
1908    .
1909    .
1911 @end example
1913 @subsection RawData
1915 The above restriction can be problematic, so @acronym{CNI} includes the
1916 @code{gnu.gcj.RawData} class.  The @code{RawData} class is a
1917 @dfn{non-scanned reference} type.  In other words variables declared
1918 of type @code{RawData} can contain any data and are not checked by the
1919 compiler or memory manager in any way.
1921 This means that you can put C/C++ data structures (including classes)
1922 in your @acronym{CNI} classes, as long as you use the appropriate cast.
1924 @noindent Here are some examples:
1926 @example
1928 class ::MyClass : public java::lang::Object
1930    gnu.gcj.RawData string;
1932    MyClass ();
1933    gnu.gcj.RawData getText ();
1934    void printText ();
1937 ::MyClass::MyClass ()
1939    char* text = ...
1940    string = text;
1943 gnu.gcj.RawData
1944 ::MyClass::getText ()
1946    return string;
1949 void
1950 ::MyClass::printText ()
1952   printf("%s\n", (char*) string);
1954 @end example
1957 @subsection RawDataManaged
1959 @code{gnu.gcj.RawDataManaged} is another type used to indicate special data used 
1960 by native code. Unlike the @code{RawData} type, fields declared as 
1961 @code{RawDataManaged} will be "marked" by the memory manager and 
1962 considered for garbage collection.  
1964 Native data which is allocated using CNI's @code{JvAllocBytes()}
1965 function and stored in a @code{RawDataManaged} will be automatically 
1966 freed when the Java object it is associated with becomes unreachable.
1968 @subsection Native memory allocation
1970 @deftypefun void* JvAllocBytes (jsize @var{size})
1971 Allocates @var{size} bytes from the heap.  The memory returned is zeroed.
1972 This memory is not scanned for pointers by the garbage collector, but will 
1973 be freed if no references to it are discovered.
1975 This function can be useful if you need to associate some native data with a
1976 Java object. Using a CNI's special @code{RawDataManaged} type, native data 
1977 allocated with @code{JvAllocBytes} will be automatically freed when the Java 
1978 object itself becomes unreachable.
1979 @end deftypefun
1981 @subsection Posix signals
1983 On Posix based systems the @code{libgcj} library uses several signals
1984 internally.  @acronym{CNI} code should not attempt to use the same
1985 signals as doing so may cause @code{libgcj} and/or the @acronym{CNI}
1986 code to fail.
1988 SIGSEGV is used on many systems to generate
1989 @code{NullPointerExceptions}.  SIGCHLD is used internally by
1990 @code{Runtime.exec()}.  Several other signals (that vary from platform to
1991 platform) can be used by the memory manager and by
1992 @code{Thread.interrupt()}.
1994 @node Exception Handling
1995 @section Exception Handling
1997 While C++ and Java share a common exception handling framework,
1998 things are not yet perfectly integrated.  The main issue is that the
1999 run-time type information facilities of the two
2000 languages are not integrated.
2002 Still, things work fairly well.  You can throw a Java exception from
2003 C++ using the ordinary @code{throw} construct, and this
2004 exception can be caught by Java code.  Similarly, you can catch an
2005 exception thrown from Java using the C++ @code{catch}
2006 construct.
2008 @noindent Here is an example:
2010 @example
2011 if (i >= count)
2012    throw new java::lang::IndexOutOfBoundsException();
2013 @end example
2015 Normally, G++ will automatically detect when you are writing C++
2016 code that uses Java exceptions, and handle them appropriately.
2017 However, if C++ code only needs to execute destructors when Java
2018 exceptions are thrown through it, GCC will guess incorrectly.  Sample
2019 problematic code:
2021 @example
2022 struct S @{ ~S(); @};
2024 extern void bar();    // @r{Is implemented in Java and may throw exceptions.}
2026 void foo()
2028   S s;
2029   bar();
2031 @end example
2033 The usual effect of an incorrect guess is a link failure, complaining of
2034 a missing routine called @code{__gxx_personality_v0}.
2036 You can inform the compiler that Java exceptions are to be used in a
2037 translation unit, irrespective of what it might think, by writing
2038 @code{#pragma GCC java_exceptions} at the head of the
2039 file.  This @code{#pragma} must appear before any
2040 functions that throw or catch exceptions, or run destructors when
2041 exceptions are thrown through them.
2043 @node Synchronization
2044 @section Synchronization
2046 Each Java object has an implicit monitor.
2047 The Java VM uses the instruction @code{monitorenter} to acquire
2048 and lock a monitor, and @code{monitorexit} to release it.
2050 The corresponding CNI macros are @code{JvMonitorEnter} and 
2051 @code{JvMonitorExit} (JNI has similar  methods @code{MonitorEnter}
2052 and @code{MonitorExit}).  
2055 The Java source language does not provide direct access to these primitives.
2056 Instead, there is a @code{synchronized} statement that does an
2057 implicit @code{monitorenter} before entry to the block,
2058 and does a @code{monitorexit} on exit from the block.
2059 Note that the lock has to be released even when the block is abnormally
2060 terminated by an exception, which means there is an implicit
2061 @code{try finally} surrounding synchronization locks.
2063 From C++, it makes sense to use a destructor to release a lock.
2064 @acronym{CNI} defines the following utility class:
2066 @example
2067 class JvSynchronize() @{
2068   jobject obj;
2069   JvSynchronize(jobject o) @{ obj = o; JvMonitorEnter(o); @}
2070   ~JvSynchronize() @{ JvMonitorExit(obj); @}
2072 @end example
2074 So this Java code:
2076 @example
2077 synchronized (OBJ)
2079    CODE
2081 @end example
2083 @noindent might become this C++ code:
2085 @example
2087    JvSynchronize dummy (OBJ);
2088    CODE;
2090 @end example
2092 Java also has methods with the @code{synchronized} attribute.
2093 This is equivalent to wrapping the entire method body in a
2094 @code{synchronized} statement.
2095 (Alternatively, an implementation could require the caller to do
2096 the synchronization.  This is not practical for a compiler, because
2097 each virtual method call would have to test at run-time if
2098 synchronization is needed.)  Since in @command{gcj}
2099 the @code{synchronized} attribute is handled by the
2100 method implementation, it is up to the programmer
2101 of a synchronized native method to handle the synchronization
2102 (in the C++ implementation of the method).
2103 In other words, you need to manually add @code{JvSynchronize}
2104 in a @code{native synchronized} method.
2106 @node Invocation
2107 @section Invocation
2109 CNI permits C++ applications to make calls into Java classes, in addition to
2110 allowing Java code to call into C++. Several functions, known as the 
2111 @dfn{invocation API}, are provided to support this.
2113 @deftypefun jint JvCreateJavaVM (JvVMInitArgs* @var{vm_args})
2115 Initializes the Java runtime. This function performs essential initialization
2116 of the threads interface, garbage collector, exception handling and other key
2117 aspects of the runtime. It must be called once by an application with
2118 a non-Java @code{main()} function, before any other Java or CNI calls are made.
2119 It is safe, but not recommended, to call @code{JvCreateJavaVM()} more than
2120 once provided it is only called from a single thread.
2121 The @var{vmargs} parameter can be used to specify initialization parameters 
2122 for the Java runtime. It may be @code{NULL}.
2124 JvVMInitArgs represents a list of virtual machine initialization
2125 arguments. @code{JvCreateJavaVM()} ignores the version field.
2127 @example
2128 typedef struct JvVMOption
2130   // a VM initialization option
2131   char* optionString;
2132   // extra information associated with this option
2133   void* extraInfo;
2134 @} JvVMOption;
2136 typedef struct JvVMInitArgs
2138   // for compatibility with JavaVMInitArgs
2139   jint version;
2141   // number of VM initialization options
2142   jint nOptions;
2144   // an array of VM initialization options
2145   JvVMOption* options;
2147   // true if the option parser should ignore unrecognized options
2148   jboolean ignoreUnrecognized;
2149 @} JvVMInitArgs;
2150 @end example
2152 @code{JvCreateJavaVM()} returns @code{0} upon success, or @code{-1} if
2153 the runtime is already initialized.
2155 @emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It
2156 is recognized and used as of release 4.0.
2157 @end deftypefun
2159 @deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group})
2160 Registers an existing thread with the Java runtime.  This must be called once
2161 from each thread, before that thread makes any other Java or CNI calls. It
2162 must be called after @code{JvCreateJavaVM}.
2163 @var{name} specifies a name for the thread. It may be @code{NULL}, in which 
2164 case a name will be generated.
2165 @var{group} is the ThreadGroup in which this thread will be a member. If it
2166 is @code{NULL}, the thread will be a member of the main thread group.
2167 The return value is the Java @code{Thread} object that represents the thread.
2168 It is safe to call @code{JvAttachCurrentThread()} more than once from the same
2169 thread. If the thread is already attached, the call is ignored and the current
2170 thread object is returned.
2171 @end deftypefun
2173 @deftypefun jint JvDetachCurrentThread ()
2174 Unregisters a thread from the Java runtime. This should be called by threads
2175 that were attached using @code{JvAttachCurrentThread()}, after they have 
2176 finished making calls to Java code. This ensures that any resources associated
2177 with the thread become eligible for garbage collection.
2178 This function returns @code{0} upon success, or @code{-1} if the current thread
2179 is not attached.
2180 @end deftypefun
2182 @subsection Handling uncaught exceptions
2184 If an exception is thrown from Java code called using the invocation API, and
2185 no handler for the exception can be found, the runtime will abort the
2186 application. In order to make the application more robust, it is recommended 
2187 that code which uses the invocation API be wrapped by a top-level try/catch 
2188 block that catches all Java exceptions.
2190 @subsection Example
2192 The following code demonstrates the use of the invocation API. In this
2193 example, the C++ application initializes the Java runtime and attaches
2194 itself. The @code{java.lang.System} class is initialized in order to
2195 access its @code{out} field, and a Java string is printed. Finally, the thread
2196 is detached from the runtime once it has finished making Java calls. Everything
2197 is wrapped with a try/catch block to provide a default handler for any uncaught 
2198 exceptions.
2200 The example can be compiled with @command{c++ test.cc -lgcj}.
2202 @example
2203 // test.cc
2204 #include <gcj/cni.h>
2205 #include <java/lang/System.h>
2206 #include <java/io/PrintStream.h>
2207 #include <java/lang/Throwable.h>
2209 int main(int argc, char *argv)
2211   using namespace java::lang;
2212   
2213   try
2214   @{
2215     JvCreateJavaVM(NULL);
2216     JvAttachCurrentThread(NULL, NULL);
2218     String *message = JvNewStringLatin1("Hello from C++");
2219     JvInitClass(&System::class$);
2220     System::out->println(message);
2222     JvDetachCurrentThread();
2223   @}
2224   catch (Throwable *t)
2225   @{
2226     System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
2227     t->printStackTrace();
2228   @}
2230 @end example
2232 @node Reflection
2233 @section Reflection
2235 Reflection is possible with CNI code, it functions similarly to how it
2236 functions with JNI@.
2238 @c clean this up...  I mean, what are the types jfieldID and jmethodID in JNI?
2239 The types @code{jfieldID} and @code{jmethodID}
2240 are as in JNI@.
2242 @noindent The functions:
2244 @itemize
2245 @item @code{JvFromReflectedField},
2246 @item @code{JvFromReflectedMethod},
2247 @item @code{JvToReflectedField}
2248 @item @code{JvToFromReflectedMethod}
2249 @end itemize
2251 @noindent will be added shortly, as will other functions corresponding to JNI@.
2254 @node System properties
2255 @chapter System properties
2257 The runtime behavior of the @code{libgcj} library can be modified by setting
2258 certain system properties.  These properties can be compiled into the program
2259 using the @code{-D@var{name}[=@var{value}]} option to @command{gcj} or by
2260 setting them explicitly in the program by calling the
2261 @code{java.lang.System.setProperty()} method.  Some system properties are only
2262 used for informational purposes (like giving a version number or a user name).
2263 A program can inspect the current value of a property by calling the
2264 @code{java.lang.System.getProperty()} method.
2266 @menu
2267 * Standard Properties::         Standard properties supported by @code{libgcj}
2268 * GNU Classpath Properties::    Properties found in Classpath based libraries
2269 * libgcj Runtime Properties::   Properties specific to @code{libgcj}
2270 @end menu
2272 @node Standard Properties
2273 @section Standard Properties
2275 The following properties are normally found in all implementations of the core
2276 libraries for the Java language.
2278 @table @gcctabopt
2280 @item java.version
2281 The @code{libgcj} version number.
2283 @item java.vendor
2284 Set to @samp{The Free Software Foundation, Inc.}
2286 @item java.vendor.url
2287 Set to @uref{http://gcc.gnu.org/java/}.
2289 @item java.home
2290 The directory where @code{gcj} was installed.  Taken from the @code{--prefix}
2291 option given to @command{configure}.
2293 @item java.class.version
2294 The class format version number supported by the libgcj byte code interpreter.
2295 (Currently @samp{46.0})
2297 @item java.vm.specification.version
2298 The Virtual Machine Specification version implemented by @code{libgcj}.
2299 (Currently @samp{1.0})
2301 @item java.vm.specification.vendor
2302 The name of the Virtual Machine specification designer.
2304 @item java.vm.specification.name
2305 The name of the Virtual Machine specification
2306 (Set to @samp{Java Virtual Machine Specification}).
2308 @item java.vm.version
2309 The @command{gcj} version number.
2311 @item java.vm.vendor
2312 Set to @samp{The Free Software Foundation, Inc.}
2314 @item java.vm.name
2315 Set to @samp{GNU libgcj}.
2317 @item java.specification.version
2318 The Runtime Environment specification version implemented by @code{libgcj}.
2319 (Currently set to @samp{1.3})
2321 @item java.specification.vendor
2322 The Runtime Environment specification designer.
2324 @item java.specification.name
2325 The name of the Runtime Environment specification
2326 (Set to @samp{Java Platform API Specification}).
2328 @item java.class.path
2329 The paths (jar files, zip files and directories) used for finding class files.
2331 @item java.library.path
2332 Directory path used for finding native libraries.
2334 @item java.io.tmpdir
2335 The directory used to put temporary files in.
2337 @item java.compiler
2338 Name of the Just In Time compiler to use by the byte code interpreter.
2339 Currently not used in @code{libgcj}.
2341 @item java.ext.dirs
2342 Directories containing jar files with extra libraries.  Will be used when
2343 resolving classes.
2345 @item java.protocol.handler.pkgs
2346 A @samp{|} separated list of package names that is used to find classes that
2347 implement handlers for @code{java.net.URL}.
2349 @item java.rmi.server.codebase
2350 A list of URLs that is used by the @code{java.rmi.server.RMIClassLoader}
2351 to load classes from.
2353 @item jdbc.drivers
2354 A list of class names that will be loaded by the @code{java.sql.DriverManager}
2355 when it starts up.
2357 @item file.separator
2358 The separator used in when directories are included in a filename
2359 (normally @samp{/} or @samp{\} ).
2361 @item file.encoding
2362 The default character encoding used when converting platform native files to
2363 Unicode (usually set to @samp{8859_1}).
2365 @item path.separator
2366 The standard separator used when a string contains multiple paths
2367 (normally @samp{:} or @samp{;}), the string is usually not a valid character
2368 to use in normal directory names.)
2370 @item line.separator
2371 The default line separator used on the platform (normally @samp{\n}, @samp{\r}
2372 or a combination of those two characters).
2374 @item policy.provider
2375 The class name used for the default policy provider returned by
2376 @code{java.security.Policy.getPolicy}.
2378 @item user.name
2379 The name of the user running the program.  Can be the full name, the login name
2380 or empty if unknown.
2382 @item user.home
2383 The default directory to put user specific files in.
2385 @item user.dir
2386 The current working directory from which the program was started.
2388 @item user.language
2389 The default language as used by the @code{java.util.Locale} class.
2391 @item user.region
2392 The default region as used by the @code{java.util.Local} class.
2394 @item user.variant
2395 The default variant of the language and region local used.
2397 @item user.timezone
2398 The default timezone as used by the @code{java.util.TimeZone} class.
2400 @item os.name
2401 The operating system/kernel name that the program runs on.
2403 @item os.arch
2404 The hardware that we are running on.
2406 @item os.version
2407 The version number of the operating system/kernel.
2409 @item awt.appletWarning
2410 The string to display when an untrusted applet is displayed.
2411 Returned by @code{java.awt.Window.getWarningString()} when the window is
2412 ``insecure''.
2414 @item awt.toolkit
2415 The class name used for initializing the default @code{java.awt.Toolkit}. 
2416 Defaults to @code{gnu.awt.gtk.GtkToolkit}.
2418 @item http.proxyHost
2419 Name of proxy host for http connections.
2421 @item http.proxyPort
2422 Port number to use when a proxy host is in use.
2424 @end table
2426 @node GNU Classpath Properties
2427 @section GNU Classpath Properties
2429 @code{libgcj} is based on the GNU Classpath (Essential Libraries for Java) a
2430 GNU project to create free core class libraries for use with virtual machines
2431 and compilers for the Java language.  The following properties are common to
2432 libraries based on GNU Classpath.
2434 @table @gcctabopt
2436 @item gcj.dumpobject
2437 Enables printing serialization debugging by the @code{java.io.ObjectInput} and
2438 @code{java.io.ObjectOutput} classes when set to something else then the empty
2439 string.  Only used when running a debug build of the library.
2441 @item gnu.classpath.vm.shortname
2442 This is a succint name of the virtual machine.  For @code{libgcj},
2443 this will always be @samp{libgcj}.
2445 @item gnu.classpath.home.url
2446 A base URL used for finding system property files (e.g.,
2447 @file{classpath.security}).  By default this is a @samp{file:} URL
2448 pointing to the @file{lib} directory under @samp{java.home}.
2450 @end table
2452 @node libgcj Runtime Properties
2453 @section libgcj Runtime Properties
2455 The following properties are specific to the @code{libgcj} runtime and will
2456 normally not be found in other core libraries for the java language.
2458 @table @gcctabopt
2460 @item java.fullversion
2461 The combination of @code{java.vm.name} and @code{java.vm.version}.
2463 @item java.vm.info
2464 Same as @code{java.fullversion}.
2466 @item impl.prefix
2467 Used by the @code{java.net.DatagramSocket} class when set to something else
2468 then the empty string.  When set all newly created @code{DatagramSocket}s will
2469 try to load a class @code{java.net.[impl.prefix]DatagramSocketImpl} instead of
2470 the normal @code{java.net.PlainDatagramSocketImpl}.
2472 @item gnu.gcj.progname
2473 The name that was used to invoked the program.
2475 @item gnu.gcj.runtime.NameFinder.demangle
2476 Whether names in a stack trace should be demangled.  Defaults to @code{true}.
2478 @item gnu.gcj.runtime.NameFinder.sanitize
2479 Whether calls to initialize exceptions and starting the runtime system
2480 should be removed from the stack trace.  Only done when names are
2481 demangled.  Defaults to @code{true}.
2483 @item gnu.gcj.runtime.NameFinder.remove_unknown
2484 Whether calls to unknown functions (class and method names are unknown)
2485 should be removed from the stack trace.  Only done when the stack is
2486 sanitized.  Ignored if this means no stack trace information would be
2487 available anymore.  Defaults to @code{true}.
2489 @item gnu.gcj.runtime.NameFinder.remove_interpreter
2490 Whether runtime interpreter calls (methods in the @code{_Jv_InterpMethod} class
2491 and functions starting with @samp{ffi_}) should be removed from the stack
2492 trace.  Only done when the stack is sanitized.  Defaults to @code{true}.
2495 @item gnu.gcj.runtime.NameFinder.use_addr2line
2496 Whether an external process (@command{addr2line} or @command{addr2name.awk})
2497 should be used as fallback to convert the addresses to function names when
2498 the runtime is unable to do it through @code{dladdr}.
2500 @item gnu.gcj.runtime.VMClassLoader.library_control
2501 This controls how shared libraries are automatically loaded by the
2502 built-in class loader.  If this property is set to @samp{full}, a full
2503 search is done for each requested class.  If this property is set to
2504 @samp{cache} (the default), then any failed lookups are cached and not
2505 tried again.  If this property is set to @samp{never}, then lookups
2506 are never done.  For more information, @xref{Extensions}.
2508 @item gnu.gcj.jit.compiler
2509 @c FIXME we should probably have a whole node on this...
2510 This is the full path to @command{gcj} executable which should be
2511 used to compile classes just-in-time when
2512 @code{ClassLoader.defineClass} is called.  If not set, @command{gcj}
2513 will not be invoked by the runtime; this can also be controlled via
2514 @code{Compiler.disable}.
2516 @item gnu.gcj.jit.options
2517 This is a space-separated string of options which should be passed to
2518 @command{gcj} when in JIT mode.  If not set, a sensible default is
2519 chosen.
2521 @item gnu.gcj.jit.cachedir
2522 This is the directory where cached shared library files are
2523 stored.  If not set, JIT compilation is disabled.  This should never
2524 be set to a directory that is writable by any other user.
2526 @item gnu.gcj.precompiled.db.path
2527 This is a sequence of file names, each referring to a file created by
2528 @command{gcj-dbtool}.  These files will be used by @code{libgcj} to
2529 find shared libraries corresponding to classes that are loaded from
2530 bytecode.
2532 @end table
2535 @node Resources
2536 @chapter Resources
2538 While writing @command{gcj} and @code{libgcj} we have, of course, relied
2539 heavily on documentation from Sun Microsystems.  In particular we have
2540 used The Java Language Specification (both first and second editions),
2541 the Java Class Libraries (volumes one and two), and the Java Virtual
2542 Machine Specification.  In addition we've used the online documentation
2543 at @uref{http://java.sun.com/}.
2545 The current @command{gcj} home page is
2546 @uref{http://gcc.gnu.org/java/}.
2548 For more information on gcc, see @uref{http://gcc.gnu.org/}.
2550 Some @code{libgcj} testing is done using the Mauve test suite.  This is
2551 a free software Java class library test suite which is being written
2552 because the JCK is not free.  See
2553 @uref{http://sources.redhat.com/mauve/} for more information.
2555 @bye