05-04-22 Thomas Koenig <Thomas.Koenig@online.de>
[official-gcc.git] / gcc / java / gcj.texi
blobd73abb4ed9a68811f4084baef327dc315ef6d08e
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 Equivalent to @code{-Xms}.
954 @item -mx=@var{number}
955 Equivalent to @code{-Xmx}.
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 these options are supported:
962 @table @gcctabopt
963 @item -Xms@var{size}
964 Set the initial heap size.
966 @item -Xmx@var{size}
967 Set the maximum heap size.
968 @end table
970 Unrecognized @code{-X} options are ignored, for compatibility with
971 other runtimes.
973 @item -jar
974 This indicates that the name passed to @code{gij} should be interpreted
975 as the name of a jar file, not a class.
977 @item --help
978 @itemx -?
979 Print help, then exit.
981 @item --showversion
982 Print version number and continue.
984 @item --fullversion
985 Print detailed version information, then exit.
987 @item --version
988 Print version number, then exit.
990 @item -verbose
991 @itemx -verbose:class
992 Each time a class is initialized, print a short message on standard error.
993 @end table
995 @code{gij} also recognizes and ignores the following options, for
996 compatibility with existing application launch scripts:
997 @code{-client}, @code{-server}, @code{-hotspot}, @code{-jrockit},
998 @code{-agentlib}, @code{-agentpath}, @code{-debug}, @code{-d32},
999 @code{-d64}, @code{-javaagent} and @code{-noclassgc}.
1001 @c man end
1003 @node Invoking gcj-dbtool
1004 @chapter Invoking gcj-dbtool.
1006 @c man title gcj-dbtool Manipulate class file mapping databases for libgcj
1008 @ignore
1009 @c man begin SYNOPSIS gcj-dbtool
1010 gcj-dbtool @option{OPTION} @var{DBFILE} [@option{MORE}] @dots{}
1012 gcj-dbtool [@option{-0}] [@option{-}] [@option{-n}] [@option{-a}] [@option{-f}]
1013   [@option{-t}] [@option{-l}] [@option{-p} [@var{LIBDIR}]]
1014   [@option{-v}] [@option{-m}] [@option{--version}] [@option{--help}]
1016 @c man end
1017 @c man begin SEEALSO gij
1018 gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
1019 and the Info entries for @file{gcj} and @file{gcc}.
1020 @c man end
1021 @end ignore
1023 @c man begin DESCRIPTION gcj-dbtool
1025 @code{gcj-dbtool} is a tool for creating and manipulating class file
1026 mapping databases.  @code{libgcj} can use these databases to find a
1027 shared library corresponding to the bytecode representation of a
1028 class.  This functionality is useful for ahead-of-time compilation of
1029 a program that has no knowledge of @code{gcj}.
1031 @code{gcj-dbtool} works best if all the jar files added to it are
1032 compiled using @code{-findirect-dispatch}.
1034 Note that @code{gcj-dbtool} is currently available as ``preview
1035 technology''.  We believe it is a reasonable way to allow
1036 application-transparent ahead-of-time compilation, but this is an
1037 unexplored area.  We welcome your comments.
1039 @c man end
1041 @c man begin OPTIONS gcj-dbtool
1043 @table @gcctabopt
1044 @item -n @var{DBFILE} [@var{SIZE}]
1045 This creates a new database.  Currently, databases cannot be resized;
1046 you can choose a larger initial size if desired.  The default size is
1047 32,749.
1049 @item -a @var{DBFILE} @var{JARFILE} @var{LIB}
1050 @itemx -f @var{DBFILE} @var{JARFILE} @var{LIB}
1051 This adds a jar file to the database.  For each class file in the jar,
1052 a cryptographic signature of the bytecode representation of the class
1053 is recorded in the database.  At runtime, a class is looked up by its
1054 signature and the compiled form of the class is looked for in the
1055 corresponding shared library.  The @option{-a} option will verify
1056 that @var{LIB} exists before adding it to the database; @option{-f}
1057 skips this check.
1059 @item [@option{-}][@option{-0}] -m @var{DBFILE} @var{DBFILE},[@var{DBFILE}]
1060 Merge a number of databases.  The output database overwrites any
1061 existing database.  To add databases into an existing database,
1062 include the destination in the list of sources.
1064 If @option{-} or @option{-0} are used, the list of files to read is
1065 taken from standard input instead of the command line.  For
1066 @option{-0}, Input filenames are terminated by a null character
1067 instead of by whitespace.  Useful when arguments might contain white
1068 space.  The GNU find -print0 option produces input suitable for this
1069 mode.
1071 @item -t @var{DBFILE}
1072 Test a database.
1074 @item -l @var{DBFILE}
1075 List the contents of a database.
1077 @item -p
1078 Print the name of the default database.  If there is no default
1079 database, this prints a blank line.  If @var{LIBDIR} is specified, use
1080 it instead of the default library directory component of the database
1081 name.
1083 @item --help
1084 Print a help message, then exit.
1086 @item --version
1087 @itemx -v
1088 Print version information, then exit.
1090 @end table
1092 @c man end
1094 @node Invoking jv-convert
1095 @chapter Invoking jv-convert
1097 @c man title jv-convert Convert file from one encoding to another
1099 @c man begin SYNOPSIS jv-convert
1100 @command{jv-convert} [@option{OPTION}] @dots{} [@var{INPUTFILE} [@var{OUTPUTFILE}]]
1101 @ignore
1103   [@option{--encoding} @var{name}]
1104   [@option{--from} @var{name}]
1105   [@option{--to} @var{name}]
1106   [@option{-i} @var{file}] [@option{-o} @var{file}]
1107   [@option{--reverse}] [@option{--help}] [@option{--version}]
1108 @end ignore
1109 @c man end
1111 @c man begin DESCRIPTION jv-convert
1113 @command{jv-convert} is a utility included with @code{libgcj} which
1114 converts a file from one encoding to another.  It is similar to the Unix
1115 @command{iconv} utility.
1117 The encodings supported by @command{jv-convert} are platform-dependent.
1118 Currently there is no way to get a list of all supported encodings.
1120 @c man end
1122 @c man begin OPTIONS jv-convert
1124 @table @gcctabopt
1125 @item --encoding @var{name}
1126 @itemx --from @var{name}
1127 Use @var{name} as the input encoding.  The default is the current
1128 locale's encoding.
1130 @item --to @var{name}
1131 Use @var{name} as the output encoding.  The default is the
1132 @code{JavaSrc} encoding; this is ASCII with @samp{\u} escapes for
1133 non-ASCII characters.
1135 @item -i @var{file}
1136 Read from @var{file}.  The default is to read from standard input.
1138 @item -o @var{file}
1139 Write to @var{file}.  The default is to write to standard output.
1141 @item --reverse
1142 Swap the input and output encodings.
1144 @item --help
1145 Print a help message, then exit.
1147 @item --version
1148 Print version information, then exit.
1149 @end table
1151 @c man end
1153 @node Invoking grmic
1154 @chapter Invoking grmic
1156 @c man title grmic Generate stubs for Remote Method Invocation
1158 @c man begin SYNOPSIS grmic
1159 @command{grmic} [@option{OPTION}] @dots{} @var{class} @dots{}
1160 @ignore
1161   [@option{-keep}]
1162   [@option{-keepgenerated}]
1163   [@option{-v1.1}]
1164   [@option{-vcompat}]
1165   [@option{-v1.2}]
1166   [@option{-nocompile}]
1167   [@option{-verbose}]
1168   [@option{-d} @var{directory}]
1169   [@option{-help}]
1170   [@option{-version}]
1171 @end ignore
1172 @c man end
1174 @c man begin DESCRIPTION grmic
1176 @command{grmic} is a utility included with @code{libgcj} which generates
1177 stubs for remote objects.
1179 @c FIXME: Add real information here.
1180 @c This really isn't much more than the --help output.
1182 Note that this program isn't yet fully compatible with the JDK
1183 @command{grmic}.  Some options, such as @option{-classpath}, are
1184 recognized but currently ignored.  We have left these options
1185 undocumented for now.
1187 Long options can also be given with a GNU-style leading @samp{--}.  For
1188 instance, @option{--help} is accepted.
1190 @c man end
1192 @c man begin OPTIONS grmic
1194 @table @gcctabopt
1195 @item -keep
1196 @itemx -keepgenerated
1197 By default, @command{grmic} deletes intermediate files.  Either of these
1198 options causes it not to delete such files.
1200 @item -v1.1
1201 Cause @command{grmic} to create stubs and skeletons for the 1.1
1202 protocol version.
1204 @item -vcompat
1205 Cause @command{grmic} to create stubs and skeletons compatible with both
1206 the 1.1 and 1.2 protocol versions.  This is the default.
1208 @item -v1.2
1209 Cause @command{grmic} to create stubs and skeletons for the 1.2
1210 protocol version.
1212 @item -nocompile
1213 Don't compile the generated files.
1215 @item -verbose
1216 Print information about what @command{grmic} is doing.
1218 @item -d @var{directory}
1219 Put output files in @var{directory}.  By default the files are put in
1220 the current working directory.
1222 @item -help
1223 Print a help message, then exit.
1225 @item -version
1226 Print version information, then exit.
1227 @end table
1229 @c man end
1232 @node Invoking grmiregistry
1233 @chapter Invoking grmiregistry
1235 @c man title grmiregistry Remote object registry
1237 @c man begin SYNOPSIS grmiregistry
1238 @command{grmic} [@option{OPTION}] @dots{} [@var{port}]
1239 @ignore
1240   [@option{--help}]
1241   [@option{--version}]
1242 @end ignore
1243 @c man end
1245 @c man begin DESCRIPTION grmiregistry
1247 @command{grmiregistry} starts a remote object registry on the current
1248 host.  If no port number is specified, then port 1099 is used.
1250 @c FIXME: Add real information here.
1251 @c This really isn't much more than the --help output.
1253 @c man end
1255 @c man begin OPTIONS grmiregistry
1257 @table @gcctabopt
1258 @item --help
1259 Print a help message, then exit.
1261 @item --version
1262 Print version information, then exit.
1263 @end table
1265 @c man end
1268 @node About CNI
1269 @chapter About CNI
1271 This documents CNI, the Compiled Native Interface,
1272 which is is a convenient way to write Java native methods using C++.
1273 This is a more efficient, more convenient, but less portable
1274 alternative to the standard JNI (Java Native Interface).
1276 @menu
1277 * Basic concepts::              Introduction to using CNI@.
1278 * Packages::                    How packages are mapped to C++.
1279 * Primitive types::             Handling Java types in C++.
1280 * Interfaces::                  How Java interfaces map to C++.
1281 * Objects and Classes::         C++ and Java classes.
1282 * Class Initialization::        How objects are initialized.
1283 * Object allocation::           How to create Java objects in C++.
1284 * Memory allocation::           How to allocate and free memory.
1285 * Arrays::                      Dealing with Java arrays in C++.
1286 * Methods::                     Java methods in C++.
1287 * Strings::                     Information about Java Strings.
1288 * Mixing with C++::             How CNI can interoperate with C++.
1289 * Exception Handling::          How exceptions are handled.
1290 * Synchronization::             Synchronizing between Java and C++.
1291 * Invocation::                  Starting the Java runtime from C++.
1292 * Reflection::                  Using reflection from C++.
1293 @end menu
1296 @node Basic concepts
1297 @section Basic concepts
1299 In terms of languages features, Java is mostly a subset
1300 of C++.  Java has a few important extensions, plus a powerful standard
1301 class library, but on the whole that does not change the basic similarity.
1302 Java is a hybrid object-oriented language, with a few native types,
1303 in addition to class types.  It is class-based, where a class may have
1304 static as well as per-object fields, and static as well as instance methods.
1305 Non-static methods may be virtual, and may be overloaded.  Overloading is
1306 resolved at compile time by matching the actual argument types against
1307 the parameter types.  Virtual methods are implemented using indirect calls
1308 through a dispatch table (virtual function table).  Objects are
1309 allocated on the heap, and initialized using a constructor method.
1310 Classes are organized in a package hierarchy.
1312 All of the listed attributes are also true of C++, though C++ has
1313 extra features (for example in C++ objects may be allocated not just
1314 on the heap, but also statically or in a local stack frame).  Because
1315 @command{gcj} uses the same compiler technology as G++ (the GNU
1316 C++ compiler), it is possible to make the intersection of the two
1317 languages use the same ABI (object representation and calling
1318 conventions).  The key idea in CNI is that Java objects are C++
1319 objects, and all Java classes are C++ classes (but not the other way
1320 around).  So the most important task in integrating Java and C++ is to
1321 remove gratuitous incompatibilities.
1323 You write CNI code as a regular C++ source file.  (You do have to use
1324 a Java/CNI-aware C++ compiler, specifically a recent version of G++.)
1326 @noindent A CNI C++ source file must have:
1328 @example
1329 #include <gcj/cni.h>
1330 @end example
1332 @noindent and then must include one header file for each Java class it uses, e.g.:
1334 @example
1335 #include <java/lang/Character.h>
1336 #include <java/util/Date.h>
1337 #include <java/lang/IndexOutOfBoundsException.h>
1338 @end example
1340 @noindent These header files are automatically generated by @code{gcjh}.
1343 CNI provides some functions and macros to make using Java objects and
1344 primitive types from C++ easier.  In general, these CNI functions and
1345 macros start with the @code{Jv} prefix, for example the function
1346 @code{JvNewObjectArray}.  This convention is used to avoid conflicts
1347 with other libraries.  Internal functions in CNI start with the prefix
1348 @code{_Jv_}.  You should not call these; if you find a need to, let us
1349 know and we will try to come up with an alternate solution.
1352 @subsection Limitations
1354 Whilst a Java class is just a C++ class that doesn't mean that you are
1355 freed from the shackles of Java, a @acronym{CNI} C++ class must adhere to the
1356 rules of the Java programming language.
1358 For example: it is not possible to declare a method in a CNI class
1359 that will take a C string (@code{char*}) as an argument, or to declare a
1360 member variable of some non-Java datatype.
1363 @node Packages
1364 @section Packages
1366 The only global names in Java are class names, and packages.  A
1367 @dfn{package} can contain zero or more classes, and also zero or more
1368 sub-packages.  Every class belongs to either an unnamed package or a
1369 package that has a hierarchical and globally unique name.
1371 A Java package is mapped to a C++ @dfn{namespace}.  The Java class
1372 @code{java.lang.String} is in the package @code{java.lang}, which is a
1373 sub-package of @code{java}.  The C++ equivalent is the class
1374 @code{java::lang::String}, which is in the namespace @code{java::lang}
1375 which is in the namespace @code{java}.
1377 @noindent Here is how you could express this:
1379 @example
1380 (// @r{Declare the class(es), possibly in a header file:}
1381 namespace java @{
1382   namespace lang @{
1383     class Object;
1384     class String;
1385     ...
1386   @}
1389 class java::lang::String : public java::lang::Object
1391   ...
1393 @end example
1395 @noindent The @code{gcjh} tool automatically generates the necessary namespace
1396 declarations.
1399 @subsection Leaving out package names
1401 Always using the fully-qualified name of a java class can be
1402 tiresomely verbose.  Using the full qualified name also ties the code
1403 to a single package making code changes necessary should the class
1404 move from one package to another.  The Java @code{package} declaration
1405 specifies that the following class declarations are in the named
1406 package, without having to explicitly name the full package
1407 qualifiers.  The @code{package} declaration can be
1408 followed by zero or more @code{import} declarations, which
1409 allows either a single class or all the classes in a package to be
1410 named by a simple identifier.  C++ provides something similar with the
1411 @code{using} declaration and directive.
1413 @noindent In Java:
1415 @example
1416 import @var{package-name}.@var{class-name};
1417 @end example
1419 @noindent allows the program text to refer to @var{class-name} as a shorthand for 
1420 the fully qualified name: @code{@var{package-name}.@var{class-name}}.
1423 @noindent To achieve the same effect C++, you have to do this:
1425 @example
1426 using @var{package-name}::@var{class-name};
1427 @end example
1430 @noindent Java can also cause imports on demand, like this:
1432 @example
1433 import @var{package-name}.*;
1434 @end example
1436 @noindent Doing this allows any class from the package @var{package-name} to be
1437 referred to only by its class-name within the program text.
1440 @noindent The same effect can be achieved in C++ like this:
1442 @example
1443 using namespace @var{package-name};
1444 @end example
1447 @node Primitive types
1448 @section Primitive types
1450 Java provides 8 @dfn{primitives} types which represent integers, floats, 
1451 characters and booleans (and also the void type).  C++ has its own
1452 very similar concrete types.  Such types in C++ however are not always
1453 implemented in the same way (an int might be 16, 32 or 64 bits for example) 
1454 so CNI provides a special C++ type for each primitive Java type:
1456 @multitable @columnfractions .20 .25 .60
1457 @item @strong{Java type}   @tab @strong{C/C++ typename} @tab @strong{Description}
1458 @item @code{char}        @tab @code{jchar}          @tab 16 bit Unicode character
1459 @item @code{boolean}     @tab @code{jboolean}       @tab logical (true or false) values
1460 @item @code{byte}        @tab @code{jbyte}          @tab 8-bit signed integer
1461 @item @code{short}       @tab @code{jshort}         @tab 16 bit signed integer
1462 @item @code{int}         @tab @code{jint}           @tab 32 bit signed integer
1463 @item @code{long}        @tab @code{jlong}          @tab 64 bit signed integer
1464 @item @code{float}       @tab @code{jfloat}         @tab 32 bit IEEE floating point number
1465 @item @code{double}      @tab @code{jdouble}        @tab 64 bit IEEE floating point number
1466 @item @code{void}        @tab @code{void}           @tab no value
1467 @end multitable
1469 When referring to a Java type You should always use these C++ typenames (e.g.: @code{jint})
1470 to avoid disappointment.
1473 @subsection Reference types associated with primitive types
1475 In Java each primitive type has an associated reference type, 
1476 e.g.: @code{boolean} has an associated @code{java.lang.Boolean} class.
1477 In order to make working with such classes easier GCJ provides the macro
1478 @code{JvPrimClass}:
1480 @deffn macro JvPrimClass type
1481 Return a pointer to the @code{Class} object corresponding to the type supplied.
1483 @example
1484 JvPrimClass(void) @result{} java.lang.Void.TYPE
1485 @end example
1487 @end deffn
1490 @node Interfaces
1491 @section Interfaces
1493 A Java class can @dfn{implement} zero or more
1494 @dfn{interfaces}, in addition to inheriting from
1495 a single base class. 
1497 @acronym{CNI} allows CNI code to implement methods of interfaces.
1498 You can also call methods through interface references, with some
1499 limitations.
1501 @acronym{CNI} doesn't understand interface inheritance at all yet.  So,
1502 you can only call an interface method when the declared type of the
1503 field being called matches the interface which declares that
1504 method.  The workaround is to cast the interface reference to the right
1505 superinterface.
1507 For example if you have: 
1509 @example 
1510 interface A 
1511 @{ 
1512   void a(); 
1513 @} 
1515 interface B extends A 
1516 @{ 
1517   void b(); 
1518 @} 
1519 @end example
1521 and declare a variable of type @code{B} in C++, you can't call
1522 @code{a()} unless you cast it to an @code{A} first.
1524 @node Objects and Classes
1525 @section Objects and Classes
1527 @subsection Classes
1529 All Java classes are derived from @code{java.lang.Object}.  C++ does
1530 not have a unique root class, but we use the C++ class
1531 @code{java::lang::Object} as the C++ version of the
1532 @code{java.lang.Object} Java class.  All other Java classes are mapped
1533 into corresponding C++ classes derived from @code{java::lang::Object}.
1535 Interface inheritance (the @code{implements} keyword) is currently not
1536 reflected in the C++ mapping.
1539 @subsection Object fields
1541 Each object contains an object header, followed by the instance fields
1542 of the class, in order.  The object header consists of a single
1543 pointer to a dispatch or virtual function table.  (There may be extra
1544 fields @emph{in front of} the object, for example for memory
1545 management, but this is invisible to the application, and the
1546 reference to the object points to the dispatch table pointer.)
1548 The fields are laid out in the same order, alignment, and size as in
1549 C++.  Specifically, 8-bit and 16-bit native types (@code{byte},
1550 @code{short}, @code{char}, and @code{boolean}) are @emph{not} widened
1551 to 32 bits.  Note that the Java VM does extend 8-bit and 16-bit types
1552 to 32 bits when on the VM stack or temporary registers.
1554 If you include the @code{gcjh}-generated header for a
1555 class, you can access fields of Java classes in the @emph{natural}
1556 way.  For example, given the following Java class:
1558 @example
1559 public class Int
1561   public int i;
1562   public Int (int i) @{ this.i = i; @}
1563   public static Int zero = new Int(0);
1565 @end example
1567 you can write:
1569 @example
1570 #include <gcj/cni.h>;
1571 #include <Int>;
1573 Int*
1574 mult (Int *p, jint k)
1576   if (k == 0)
1577     return Int::zero;  // @r{Static member access.}
1578   return new Int(p->i * k);
1580 @end example
1583 @subsection Access specifiers
1585 CNI does not strictly enforce the Java access
1586 specifiers, because Java permissions cannot be directly mapped
1587 into C++ permission.  Private Java fields and methods are mapped
1588 to private C++ fields and methods, but other fields and methods
1589 are mapped to public fields and methods.
1593 @node Class Initialization
1594 @section Class Initialization
1596 Java requires that each class be automatically initialized at the time 
1597 of the first active use.  Initializing a class involves 
1598 initializing the static fields, running code in class initializer 
1599 methods, and initializing base classes.  There may also be 
1600 some implementation specific actions, such as allocating 
1601 @code{String} objects corresponding to string literals in
1602 the code.
1604 The GCJ compiler inserts calls to @code{JvInitClass} at appropriate
1605 places to ensure that a class is initialized when required.  The C++
1606 compiler does not insert these calls automatically---it is the
1607 programmer's responsibility to make sure classes are initialized.
1608 However, this is fairly painless because of the conventions assumed by
1609 the Java system.
1611 First, @code{libgcj} will make sure a class is initialized before an
1612 instance of that object is created.  This is one of the
1613 responsibilities of the @code{new} operation.  This is taken care of
1614 both in Java code, and in C++ code.  When G++ sees a @code{new} of a
1615 Java class, it will call a routine in @code{libgcj} to allocate the
1616 object, and that routine will take care of initializing the class.
1617 Note however that this does not happen for Java arrays; you must
1618 allocate those using the appropriate CNI function.  It follows that
1619 you can access an instance field, or call an instance (non-static)
1620 method and be safe in the knowledge that the class and all of its base
1621 classes have been initialized.
1623 Invoking a static method is also safe.  This is because the
1624 Java compiler adds code to the start of a static method to make sure
1625 the class is initialized.  However, the C++ compiler does not
1626 add this extra code.  Hence, if you write a native static method
1627 using CNI, you are responsible for calling @code{JvInitClass}
1628 before doing anything else in the method (unless you are sure
1629 it is safe to leave it out).
1631 Accessing a static field also requires the class of the
1632 field to be initialized.  The Java compiler will generate code
1633 to call @code{JvInitClass} before getting or setting the field.
1634 However, the C++ compiler will not generate this extra code,
1635 so it is your responsibility to make sure the class is
1636 initialized before you access a static field from C++.
1639 @node Object allocation
1640 @section Object allocation
1642 New Java objects are allocated using a
1643 @dfn{class instance creation expression}, e.g.:
1645 @example
1646 new @var{Type} ( ... )
1647 @end example
1649 The same syntax is used in C++.  The main difference is that
1650 C++ objects have to be explicitly deleted; in Java they are
1651 automatically deleted by the garbage collector.
1652 Using @acronym{CNI}, you can allocate a new Java object
1653 using standard C++ syntax and the C++ compiler will allocate
1654 memory from the garbage collector.  If you have overloaded
1655 constructors, the compiler will choose the correct one
1656 using standard C++ overload resolution rules.  
1658 @noindent For example:
1660 @example
1661 java::util::Hashtable *ht = new java::util::Hashtable(120);
1662 @end example
1665 @node Memory allocation
1666 @section Memory allocation
1668 When allocating memory in @acronym{CNI} methods it is best to handle
1669 out-of-memory conditions by throwing a Java exception.  These
1670 functions are provided for that purpose:
1672 @deftypefun void* JvMalloc (jsize @var{size})
1673 Calls malloc.  Throws @code{java.lang.OutOfMemoryError} if allocation
1674 fails.
1675 @end deftypefun
1677 @deftypefun void* JvRealloc (void* @var{ptr}, jsize @var{size})
1678 Calls realloc.  Throws @code{java.lang.OutOfMemoryError} if
1679 reallocation fails.
1680 @end deftypefun
1682 @deftypefun void JvFree (void* @var{ptr})
1683 Calls free.
1684 @end deftypefun
1686 @node Arrays
1687 @section Arrays
1689 While in many ways Java is similar to C and C++, it is quite different
1690 in its treatment of arrays.  C arrays are based on the idea of pointer
1691 arithmetic, which would be incompatible with Java's security
1692 requirements.  Java arrays are true objects (array types inherit from
1693 @code{java.lang.Object}).  An array-valued variable is one that
1694 contains a reference (pointer) to an array object.
1696 Referencing a Java array in C++ code is done using the
1697 @code{JArray} template, which as defined as follows:
1699 @example
1700 class __JArray : public java::lang::Object
1702 public:
1703   int length;
1706 template<class T>
1707 class JArray : public __JArray
1709   T data[0];
1710 public:
1711   T& operator[](jint i) @{ return data[i]; @}
1713 @end example
1716 There are a number of @code{typedef}s which correspond to @code{typedef}s 
1717 from the @acronym{JNI}.  Each is the type of an array holding objects
1718 of the relevant type:
1720 @example
1721 typedef __JArray *jarray;
1722 typedef JArray<jobject> *jobjectArray;
1723 typedef JArray<jboolean> *jbooleanArray;
1724 typedef JArray<jbyte> *jbyteArray;
1725 typedef JArray<jchar> *jcharArray;
1726 typedef JArray<jshort> *jshortArray;
1727 typedef JArray<jint> *jintArray;
1728 typedef JArray<jlong> *jlongArray;
1729 typedef JArray<jfloat> *jfloatArray;
1730 typedef JArray<jdouble> *jdoubleArray;
1731 @end example
1734 @deftypemethod {template<class T>} T* elements (JArray<T> @var{array})
1735 This template function can be used to get a pointer to the elements of
1736 the @code{array}.  For instance, you can fetch a pointer to the
1737 integers that make up an @code{int[]} like so:
1739 @example
1740 extern jintArray foo;
1741 jint *intp = elements (foo);
1742 @end example
1744 The name of this function may change in the future.
1745 @end deftypemethod
1748 @deftypefun jobjectArray JvNewObjectArray (jsize @var{length}, jclass @var{klass}, jobject @var{init})
1749 Here @code{klass} is the type of elements of the array and
1750 @code{init} is the initial value put into every slot in the array.
1751 @end deftypefun
1754 @subsection Creating arrays
1756 For each primitive type there is a function which can be used to
1757 create a new array of that type.  The name of the function is of the
1758 form:
1760 @example
1761 JvNew@var{Type}Array
1762 @end example
1764 @noindent For example:
1766 @example
1767 JvNewBooleanArray
1768 @end example
1770 @noindent can be used to create an array of Java primitive boolean types.
1772 @noindent The following function definition is the template for all such functions:
1774 @deftypefun jbooleanArray JvNewBooleanArray (jint @var{length})
1775 Create's an array @var{length} indices long.
1776 @end deftypefun
1778 @deftypefun jsize JvGetArrayLength (jarray @var{array})
1779 Returns the length of the @var{array}.
1780 @end deftypefun
1783 @node Methods
1784 @section Methods
1786 Java methods are mapped directly into C++ methods.
1787 The header files generated by @code{gcjh}
1788 include the appropriate method definitions.
1789 Basically, the generated methods have the same names and
1790 @emph{corresponding} types as the Java methods,
1791 and are called in the natural manner.
1793 @subsection Overloading
1795 Both Java and C++ provide method overloading, where multiple
1796 methods in a class have the same name, and the correct one is chosen
1797 (at compile time) depending on the argument types.
1798 The rules for choosing the correct method are (as expected) more complicated
1799 in C++ than in Java, but given a set of overloaded methods
1800 generated by @code{gcjh} the C++ compiler will choose
1801 the expected one.
1803 Common assemblers and linkers are not aware of C++ overloading,
1804 so the standard implementation strategy is to encode the
1805 parameter types of a method into its assembly-level name.
1806 This encoding is called @dfn{mangling},
1807 and the encoded name is the @dfn{mangled name}.
1808 The same mechanism is used to implement Java overloading.
1809 For C++/Java interoperability, it is important that both the Java
1810 and C++ compilers use the @emph{same} encoding scheme.
1812 @subsection Static methods
1814 Static Java methods are invoked in @acronym{CNI} using the standard
1815 C++ syntax, using the @code{::} operator rather
1816 than the @code{.} operator.  
1818 @noindent For example:
1820 @example
1821 jint i = java::lang::Math::round((jfloat) 2.3);
1822 @end example
1824 @noindent C++ method definition syntax is used to define a static native method.
1825 For example:
1827 @example
1828 #include <java/lang/Integer>
1829 java::lang::Integer*
1830 java::lang::Integer::getInteger(jstring str)
1832   ...
1834 @end example
1837 @subsection Object Constructors
1839 Constructors are called implicitly as part of object allocation
1840 using the @code{new} operator.  
1842 @noindent For example:
1844 @example
1845 java::lang::Integer *x = new java::lang::Integer(234);
1846 @end example
1848 Java does not allow a constructor to be a native method.
1849 This limitation can be coded round however because a constructor
1850 can @emph{call} a native method.
1853 @subsection Instance methods
1855 Calling a Java instance method from a C++ @acronym{CNI} method is done 
1856 using the standard C++ syntax, e.g.:
1858 @example
1859 // @r{First create the Java object.}
1860 java::lang::Integer *x = new java::lang::Integer(234);
1861 // @r{Now call a method.}
1862 jint prim_value = x->intValue();
1863 if (x->longValue == 0) 
1864   ...
1865 @end example
1867 @noindent Defining a Java native instance method is also done the natural way:
1869 @example
1870 #include <java/lang/Integer.h>
1872 jdouble
1873 java::lang:Integer::doubleValue()
1875   return (jdouble) value;
1877 @end example
1880 @subsection Interface methods
1882 In Java you can call a method using an interface reference.  This is
1883 supported, but not completely.  @xref{Interfaces}.
1888 @node Strings
1889 @section Strings
1891 @acronym{CNI} provides a number of utility functions for
1892 working with Java Java @code{String} objects.
1893 The names and interfaces are analogous to those of @acronym{JNI}.
1896 @deftypefun jstring JvNewString (const char* @var{chars}, jsize @var{len})
1897 Returns a Java @code{String} object with characters from the C string
1898 @var{chars} up to the index @var{len} in that array.
1899 @end deftypefun
1901 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}, jsize @var{len})
1902 Returns a Java @code{String} made up of @var{len} bytes from @var{bytes}.
1903 @end deftypefun
1906 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes})
1907 As above but the length of the @code{String} is @code{strlen(@var{bytes})}.
1908 @end deftypefun
1910 @deftypefun jstring JvNewStringUTF (const char* @var{bytes})
1911 Returns a @code{String} which is made up of the UTF encoded characters
1912 present in the C string @var{bytes}.
1913 @end deftypefun
1915 @deftypefun jchar* JvGetStringChars (jstring @var{str})
1916 Returns a pointer to an array of characters making up the @code{String} @var{str}.
1917 @end deftypefun
1919 @deftypefun int JvGetStringUTFLength (jstring @var{str})
1920 Returns the number of bytes required to encode the contents of the
1921 @code{String} @var{str} in UTF-8.
1922 @end deftypefun
1924 @deftypefun jsize JvGetStringUTFRegion (jstring @var{str}, jsize @var{start}, jsize @var{len}, char* @var{buf})
1925 Puts the UTF-8 encoding of a region of the @code{String} @var{str} into 
1926 the buffer @code{buf}.  The region to fetch is marked by @var{start} and @var{len}.
1928 Note that @var{buf} is a buffer, not a C string.  It is @emph{not} 
1929 null terminated.
1930 @end deftypefun
1933 @node Mixing with C++
1934 @section Interoperating with C/C++
1936 Because @acronym{CNI} is designed to represent Java classes and methods it
1937 cannot be mixed readily with C/C++ types.
1939 One important restriction is that Java classes cannot have non-Java
1940 type instance or static variables and cannot have methods which take
1941 non-Java types as arguments or return non-Java types.
1943 @noindent None of the following is possible with CNI:
1945 @example
1947 class ::MyClass : public java::lang::Object
1949    char* variable;  // @r{char* is not a valid Java type.}
1953 uint
1954 ::SomeClass::someMethod (char *arg)
1956   .
1957   .
1958   .
1959 @}   // @r{@code{uint} is not a valid Java type, neither is @code{char*}}
1960 @end example
1962 @noindent Of course, it is ok to use C/C++ types within the scope of a method:
1965 @example
1966 jint
1967 ::SomeClass::otherMethod (jstring str)
1969    char *arg = ...
1970    .
1971    .
1972    .
1974 @end example
1976 @subsection RawData
1978 The above restriction can be problematic, so @acronym{CNI} includes the
1979 @code{gnu.gcj.RawData} class.  The @code{RawData} class is a
1980 @dfn{non-scanned reference} type.  In other words variables declared
1981 of type @code{RawData} can contain any data and are not checked by the
1982 compiler or memory manager in any way.
1984 This means that you can put C/C++ data structures (including classes)
1985 in your @acronym{CNI} classes, as long as you use the appropriate cast.
1987 @noindent Here are some examples:
1989 @example
1991 class ::MyClass : public java::lang::Object
1993    gnu.gcj.RawData string;
1995    MyClass ();
1996    gnu.gcj.RawData getText ();
1997    void printText ();
2000 ::MyClass::MyClass ()
2002    char* text = ...
2003    string = text;
2006 gnu.gcj.RawData
2007 ::MyClass::getText ()
2009    return string;
2012 void
2013 ::MyClass::printText ()
2015   printf("%s\n", (char*) string);
2017 @end example
2020 @subsection RawDataManaged
2022 @code{gnu.gcj.RawDataManaged} is another type used to indicate special data used 
2023 by native code. Unlike the @code{RawData} type, fields declared as 
2024 @code{RawDataManaged} will be "marked" by the memory manager and 
2025 considered for garbage collection.  
2027 Native data which is allocated using CNI's @code{JvAllocBytes()}
2028 function and stored in a @code{RawDataManaged} will be automatically 
2029 freed when the Java object it is associated with becomes unreachable.
2031 @subsection Native memory allocation
2033 @deftypefun void* JvAllocBytes (jsize @var{size})
2034 Allocates @var{size} bytes from the heap.  The memory returned is zeroed.
2035 This memory is not scanned for pointers by the garbage collector, but will 
2036 be freed if no references to it are discovered.
2038 This function can be useful if you need to associate some native data with a
2039 Java object. Using a CNI's special @code{RawDataManaged} type, native data 
2040 allocated with @code{JvAllocBytes} will be automatically freed when the Java 
2041 object itself becomes unreachable.
2042 @end deftypefun
2044 @subsection Posix signals
2046 On Posix based systems the @code{libgcj} library uses several signals
2047 internally.  @acronym{CNI} code should not attempt to use the same
2048 signals as doing so may cause @code{libgcj} and/or the @acronym{CNI}
2049 code to fail.
2051 SIGSEGV is used on many systems to generate
2052 @code{NullPointerExceptions}.  SIGCHLD is used internally by
2053 @code{Runtime.exec()}.  Several other signals (that vary from platform to
2054 platform) can be used by the memory manager and by
2055 @code{Thread.interrupt()}.
2057 @node Exception Handling
2058 @section Exception Handling
2060 While C++ and Java share a common exception handling framework,
2061 things are not yet perfectly integrated.  The main issue is that the
2062 run-time type information facilities of the two
2063 languages are not integrated.
2065 Still, things work fairly well.  You can throw a Java exception from
2066 C++ using the ordinary @code{throw} construct, and this
2067 exception can be caught by Java code.  Similarly, you can catch an
2068 exception thrown from Java using the C++ @code{catch}
2069 construct.
2071 @noindent Here is an example:
2073 @example
2074 if (i >= count)
2075    throw new java::lang::IndexOutOfBoundsException();
2076 @end example
2078 Normally, G++ will automatically detect when you are writing C++
2079 code that uses Java exceptions, and handle them appropriately.
2080 However, if C++ code only needs to execute destructors when Java
2081 exceptions are thrown through it, GCC will guess incorrectly.  Sample
2082 problematic code:
2084 @example
2085 struct S @{ ~S(); @};
2087 extern void bar();    // @r{Is implemented in Java and may throw exceptions.}
2089 void foo()
2091   S s;
2092   bar();
2094 @end example
2096 The usual effect of an incorrect guess is a link failure, complaining of
2097 a missing routine called @code{__gxx_personality_v0}.
2099 You can inform the compiler that Java exceptions are to be used in a
2100 translation unit, irrespective of what it might think, by writing
2101 @code{#pragma GCC java_exceptions} at the head of the
2102 file.  This @code{#pragma} must appear before any
2103 functions that throw or catch exceptions, or run destructors when
2104 exceptions are thrown through them.
2106 @node Synchronization
2107 @section Synchronization
2109 Each Java object has an implicit monitor.
2110 The Java VM uses the instruction @code{monitorenter} to acquire
2111 and lock a monitor, and @code{monitorexit} to release it.
2113 The corresponding CNI macros are @code{JvMonitorEnter} and 
2114 @code{JvMonitorExit} (JNI has similar  methods @code{MonitorEnter}
2115 and @code{MonitorExit}).  
2118 The Java source language does not provide direct access to these primitives.
2119 Instead, there is a @code{synchronized} statement that does an
2120 implicit @code{monitorenter} before entry to the block,
2121 and does a @code{monitorexit} on exit from the block.
2122 Note that the lock has to be released even when the block is abnormally
2123 terminated by an exception, which means there is an implicit
2124 @code{try finally} surrounding synchronization locks.
2126 From C++, it makes sense to use a destructor to release a lock.
2127 @acronym{CNI} defines the following utility class:
2129 @example
2130 class JvSynchronize() @{
2131   jobject obj;
2132   JvSynchronize(jobject o) @{ obj = o; JvMonitorEnter(o); @}
2133   ~JvSynchronize() @{ JvMonitorExit(obj); @}
2135 @end example
2137 So this Java code:
2139 @example
2140 synchronized (OBJ)
2142    CODE
2144 @end example
2146 @noindent might become this C++ code:
2148 @example
2150    JvSynchronize dummy (OBJ);
2151    CODE;
2153 @end example
2155 Java also has methods with the @code{synchronized} attribute.
2156 This is equivalent to wrapping the entire method body in a
2157 @code{synchronized} statement.
2158 (Alternatively, an implementation could require the caller to do
2159 the synchronization.  This is not practical for a compiler, because
2160 each virtual method call would have to test at run-time if
2161 synchronization is needed.)  Since in @command{gcj}
2162 the @code{synchronized} attribute is handled by the
2163 method implementation, it is up to the programmer
2164 of a synchronized native method to handle the synchronization
2165 (in the C++ implementation of the method).
2166 In other words, you need to manually add @code{JvSynchronize}
2167 in a @code{native synchronized} method.
2169 @node Invocation
2170 @section Invocation
2172 CNI permits C++ applications to make calls into Java classes, in addition to
2173 allowing Java code to call into C++. Several functions, known as the 
2174 @dfn{invocation API}, are provided to support this.
2176 @deftypefun jint JvCreateJavaVM (JvVMInitArgs* @var{vm_args})
2178 Initializes the Java runtime. This function performs essential initialization
2179 of the threads interface, garbage collector, exception handling and other key
2180 aspects of the runtime. It must be called once by an application with
2181 a non-Java @code{main()} function, before any other Java or CNI calls are made.
2182 It is safe, but not recommended, to call @code{JvCreateJavaVM()} more than
2183 once provided it is only called from a single thread.
2184 The @var{vmargs} parameter can be used to specify initialization parameters 
2185 for the Java runtime. It may be @code{NULL}.
2187 JvVMInitArgs represents a list of virtual machine initialization
2188 arguments. @code{JvCreateJavaVM()} ignores the version field.
2190 @example
2191 typedef struct JvVMOption
2193   // a VM initialization option
2194   char* optionString;
2195   // extra information associated with this option
2196   void* extraInfo;
2197 @} JvVMOption;
2199 typedef struct JvVMInitArgs
2201   // for compatibility with JavaVMInitArgs
2202   jint version;
2204   // number of VM initialization options
2205   jint nOptions;
2207   // an array of VM initialization options
2208   JvVMOption* options;
2210   // true if the option parser should ignore unrecognized options
2211   jboolean ignoreUnrecognized;
2212 @} JvVMInitArgs;
2213 @end example
2215 @code{JvCreateJavaVM()} returns @code{0} upon success, or @code{-1} if
2216 the runtime is already initialized.
2218 @emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It
2219 is recognized and used as of release 4.0.
2220 @end deftypefun
2222 @deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group})
2223 Registers an existing thread with the Java runtime.  This must be called once
2224 from each thread, before that thread makes any other Java or CNI calls. It
2225 must be called after @code{JvCreateJavaVM}.
2226 @var{name} specifies a name for the thread. It may be @code{NULL}, in which 
2227 case a name will be generated.
2228 @var{group} is the ThreadGroup in which this thread will be a member. If it
2229 is @code{NULL}, the thread will be a member of the main thread group.
2230 The return value is the Java @code{Thread} object that represents the thread.
2231 It is safe to call @code{JvAttachCurrentThread()} more than once from the same
2232 thread. If the thread is already attached, the call is ignored and the current
2233 thread object is returned.
2234 @end deftypefun
2236 @deftypefun jint JvDetachCurrentThread ()
2237 Unregisters a thread from the Java runtime. This should be called by threads
2238 that were attached using @code{JvAttachCurrentThread()}, after they have 
2239 finished making calls to Java code. This ensures that any resources associated
2240 with the thread become eligible for garbage collection.
2241 This function returns @code{0} upon success, or @code{-1} if the current thread
2242 is not attached.
2243 @end deftypefun
2245 @subsection Handling uncaught exceptions
2247 If an exception is thrown from Java code called using the invocation API, and
2248 no handler for the exception can be found, the runtime will abort the
2249 application. In order to make the application more robust, it is recommended 
2250 that code which uses the invocation API be wrapped by a top-level try/catch 
2251 block that catches all Java exceptions.
2253 @subsection Example
2255 The following code demonstrates the use of the invocation API. In this
2256 example, the C++ application initializes the Java runtime and attaches
2257 itself. The @code{java.lang.System} class is initialized in order to
2258 access its @code{out} field, and a Java string is printed. Finally, the thread
2259 is detached from the runtime once it has finished making Java calls. Everything
2260 is wrapped with a try/catch block to provide a default handler for any uncaught 
2261 exceptions.
2263 The example can be compiled with @command{c++ test.cc -lgcj}.
2265 @example
2266 // test.cc
2267 #include <gcj/cni.h>
2268 #include <java/lang/System.h>
2269 #include <java/io/PrintStream.h>
2270 #include <java/lang/Throwable.h>
2272 int main(int argc, char *argv)
2274   using namespace java::lang;
2275   
2276   try
2277   @{
2278     JvCreateJavaVM(NULL);
2279     JvAttachCurrentThread(NULL, NULL);
2281     String *message = JvNewStringLatin1("Hello from C++");
2282     JvInitClass(&System::class$);
2283     System::out->println(message);
2285     JvDetachCurrentThread();
2286   @}
2287   catch (Throwable *t)
2288   @{
2289     System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
2290     t->printStackTrace();
2291   @}
2293 @end example
2295 @node Reflection
2296 @section Reflection
2298 Reflection is possible with CNI code, it functions similarly to how it
2299 functions with JNI@.
2301 @c clean this up...  I mean, what are the types jfieldID and jmethodID in JNI?
2302 The types @code{jfieldID} and @code{jmethodID}
2303 are as in JNI@.
2305 @noindent The functions:
2307 @itemize
2308 @item @code{JvFromReflectedField},
2309 @item @code{JvFromReflectedMethod},
2310 @item @code{JvToReflectedField}
2311 @item @code{JvToFromReflectedMethod}
2312 @end itemize
2314 @noindent will be added shortly, as will other functions corresponding to JNI@.
2317 @node System properties
2318 @chapter System properties
2320 The runtime behavior of the @code{libgcj} library can be modified by setting
2321 certain system properties.  These properties can be compiled into the program
2322 using the @code{-D@var{name}[=@var{value}]} option to @command{gcj} or by
2323 setting them explicitly in the program by calling the
2324 @code{java.lang.System.setProperty()} method.  Some system properties are only
2325 used for informational purposes (like giving a version number or a user name).
2326 A program can inspect the current value of a property by calling the
2327 @code{java.lang.System.getProperty()} method.
2329 @menu
2330 * Standard Properties::         Standard properties supported by @code{libgcj}
2331 * GNU Classpath Properties::    Properties found in Classpath based libraries
2332 * libgcj Runtime Properties::   Properties specific to @code{libgcj}
2333 @end menu
2335 @node Standard Properties
2336 @section Standard Properties
2338 The following properties are normally found in all implementations of the core
2339 libraries for the Java language.
2341 @table @gcctabopt
2343 @item java.version
2344 The @code{libgcj} version number.
2346 @item java.vendor
2347 Set to @samp{The Free Software Foundation, Inc.}
2349 @item java.vendor.url
2350 Set to @uref{http://gcc.gnu.org/java/}.
2352 @item java.home
2353 The directory where @code{gcj} was installed.  Taken from the @code{--prefix}
2354 option given to @command{configure}.
2356 @item java.class.version
2357 The class format version number supported by the libgcj byte code interpreter.
2358 (Currently @samp{46.0})
2360 @item java.vm.specification.version
2361 The Virtual Machine Specification version implemented by @code{libgcj}.
2362 (Currently @samp{1.0})
2364 @item java.vm.specification.vendor
2365 The name of the Virtual Machine specification designer.
2367 @item java.vm.specification.name
2368 The name of the Virtual Machine specification
2369 (Set to @samp{Java Virtual Machine Specification}).
2371 @item java.vm.version
2372 The @command{gcj} version number.
2374 @item java.vm.vendor
2375 Set to @samp{The Free Software Foundation, Inc.}
2377 @item java.vm.name
2378 Set to @samp{GNU libgcj}.
2380 @item java.specification.version
2381 The Runtime Environment specification version implemented by @code{libgcj}.
2382 (Currently set to @samp{1.3})
2384 @item java.specification.vendor
2385 The Runtime Environment specification designer.
2387 @item java.specification.name
2388 The name of the Runtime Environment specification
2389 (Set to @samp{Java Platform API Specification}).
2391 @item java.class.path
2392 The paths (jar files, zip files and directories) used for finding class files.
2394 @item java.library.path
2395 Directory path used for finding native libraries.
2397 @item java.io.tmpdir
2398 The directory used to put temporary files in.
2400 @item java.compiler
2401 Name of the Just In Time compiler to use by the byte code interpreter.
2402 Currently not used in @code{libgcj}.
2404 @item java.ext.dirs
2405 Directories containing jar files with extra libraries.  Will be used when
2406 resolving classes.
2408 @item java.protocol.handler.pkgs
2409 A @samp{|} separated list of package names that is used to find classes that
2410 implement handlers for @code{java.net.URL}.
2412 @item java.rmi.server.codebase
2413 A list of URLs that is used by the @code{java.rmi.server.RMIClassLoader}
2414 to load classes from.
2416 @item jdbc.drivers
2417 A list of class names that will be loaded by the @code{java.sql.DriverManager}
2418 when it starts up.
2420 @item file.separator
2421 The separator used in when directories are included in a filename
2422 (normally @samp{/} or @samp{\} ).
2424 @item file.encoding
2425 The default character encoding used when converting platform native files to
2426 Unicode (usually set to @samp{8859_1}).
2428 @item path.separator
2429 The standard separator used when a string contains multiple paths
2430 (normally @samp{:} or @samp{;}), the string is usually not a valid character
2431 to use in normal directory names.)
2433 @item line.separator
2434 The default line separator used on the platform (normally @samp{\n}, @samp{\r}
2435 or a combination of those two characters).
2437 @item policy.provider
2438 The class name used for the default policy provider returned by
2439 @code{java.security.Policy.getPolicy}.
2441 @item user.name
2442 The name of the user running the program.  Can be the full name, the login name
2443 or empty if unknown.
2445 @item user.home
2446 The default directory to put user specific files in.
2448 @item user.dir
2449 The current working directory from which the program was started.
2451 @item user.language
2452 The default language as used by the @code{java.util.Locale} class.
2454 @item user.region
2455 The default region as used by the @code{java.util.Local} class.
2457 @item user.variant
2458 The default variant of the language and region local used.
2460 @item user.timezone
2461 The default timezone as used by the @code{java.util.TimeZone} class.
2463 @item os.name
2464 The operating system/kernel name that the program runs on.
2466 @item os.arch
2467 The hardware that we are running on.
2469 @item os.version
2470 The version number of the operating system/kernel.
2472 @item awt.appletWarning
2473 The string to display when an untrusted applet is displayed.
2474 Returned by @code{java.awt.Window.getWarningString()} when the window is
2475 ``insecure''.
2477 @item awt.toolkit
2478 The class name used for initializing the default @code{java.awt.Toolkit}. 
2479 Defaults to @code{gnu.awt.gtk.GtkToolkit}.
2481 @item http.proxyHost
2482 Name of proxy host for http connections.
2484 @item http.proxyPort
2485 Port number to use when a proxy host is in use.
2487 @end table
2489 @node GNU Classpath Properties
2490 @section GNU Classpath Properties
2492 @code{libgcj} is based on the GNU Classpath (Essential Libraries for Java) a
2493 GNU project to create free core class libraries for use with virtual machines
2494 and compilers for the Java language.  The following properties are common to
2495 libraries based on GNU Classpath.
2497 @table @gcctabopt
2499 @item gcj.dumpobject
2500 Enables printing serialization debugging by the @code{java.io.ObjectInput} and
2501 @code{java.io.ObjectOutput} classes when set to something else then the empty
2502 string.  Only used when running a debug build of the library.
2504 @item gnu.classpath.vm.shortname
2505 This is a succint name of the virtual machine.  For @code{libgcj},
2506 this will always be @samp{libgcj}.
2508 @item gnu.classpath.home.url
2509 A base URL used for finding system property files (e.g.,
2510 @file{classpath.security}).  By default this is a @samp{file:} URL
2511 pointing to the @file{lib} directory under @samp{java.home}.
2513 @end table
2515 @node libgcj Runtime Properties
2516 @section libgcj Runtime Properties
2518 The following properties are specific to the @code{libgcj} runtime and will
2519 normally not be found in other core libraries for the java language.
2521 @table @gcctabopt
2523 @item java.fullversion
2524 The combination of @code{java.vm.name} and @code{java.vm.version}.
2526 @item java.vm.info
2527 Same as @code{java.fullversion}.
2529 @item impl.prefix
2530 Used by the @code{java.net.DatagramSocket} class when set to something else
2531 then the empty string.  When set all newly created @code{DatagramSocket}s will
2532 try to load a class @code{java.net.[impl.prefix]DatagramSocketImpl} instead of
2533 the normal @code{java.net.PlainDatagramSocketImpl}.
2535 @item gnu.gcj.progname
2536 The name that was used to invoked the program.
2538 @item gnu.gcj.runtime.NameFinder.demangle
2539 Whether names in a stack trace should be demangled.  Defaults to @code{true}.
2541 @item gnu.gcj.runtime.NameFinder.sanitize
2542 Whether calls to initialize exceptions and starting the runtime system
2543 should be removed from the stack trace.  Only done when names are
2544 demangled.  Defaults to @code{true}.
2546 @item gnu.gcj.runtime.NameFinder.remove_unknown
2547 Whether calls to unknown functions (class and method names are unknown)
2548 should be removed from the stack trace.  Only done when the stack is
2549 sanitized.  Ignored if this means no stack trace information would be
2550 available anymore.  Defaults to @code{true}.
2552 @item gnu.gcj.runtime.NameFinder.remove_interpreter
2553 Whether runtime interpreter calls (methods in the @code{_Jv_InterpMethod} class
2554 and functions starting with @samp{ffi_}) should be removed from the stack
2555 trace.  Only done when the stack is sanitized.  Defaults to @code{true}.
2558 @item gnu.gcj.runtime.NameFinder.use_addr2line
2559 Whether an external process (@command{addr2line} or @command{addr2name.awk})
2560 should be used as fallback to convert the addresses to function names when
2561 the runtime is unable to do it through @code{dladdr}.
2563 @item gnu.gcj.runtime.VMClassLoader.library_control
2564 This controls how shared libraries are automatically loaded by the
2565 built-in class loader.  If this property is set to @samp{full}, a full
2566 search is done for each requested class.  If this property is set to
2567 @samp{cache} (the default), then any failed lookups are cached and not
2568 tried again.  If this property is set to @samp{never}, then lookups
2569 are never done.  For more information, @xref{Extensions}.
2571 @item gnu.gcj.runtime.endorsed.dirs
2572 This is like the standard @code{java.endorsed.dirs}, property, but
2573 specifies some extra directories which are searched after the standard
2574 endorsed directories.  This is primarily useful for telling
2575 @code{libgcj} about additional libraries which are ordinarily
2576 incorporated into the JDK, and which should be loaded by the bootstrap
2577 class loader, but which are not yet part of @code{libgcj} itself for
2578 some reason.
2580 @item gnu.gcj.jit.compiler
2581 @c FIXME we should probably have a whole node on this...
2582 This is the full path to @command{gcj} executable which should be
2583 used to compile classes just-in-time when
2584 @code{ClassLoader.defineClass} is called.  If not set, @command{gcj}
2585 will not be invoked by the runtime; this can also be controlled via
2586 @code{Compiler.disable}.
2588 @item gnu.gcj.jit.options
2589 This is a space-separated string of options which should be passed to
2590 @command{gcj} when in JIT mode.  If not set, a sensible default is
2591 chosen.
2593 @item gnu.gcj.jit.cachedir
2594 This is the directory where cached shared library files are
2595 stored.  If not set, JIT compilation is disabled.  This should never
2596 be set to a directory that is writable by any other user.
2598 @item gnu.gcj.precompiled.db.path
2599 This is a sequence of file names, each referring to a file created by
2600 @command{gcj-dbtool}.  These files will be used by @code{libgcj} to
2601 find shared libraries corresponding to classes that are loaded from
2602 bytecode.  @code{libgcj} often has a built-in default database; it
2603 can be queried using @code{gcj-dbtool -p}.
2605 @end table
2608 @node Resources
2609 @chapter Resources
2611 While writing @command{gcj} and @code{libgcj} we have, of course, relied
2612 heavily on documentation from Sun Microsystems.  In particular we have
2613 used The Java Language Specification (both first and second editions),
2614 the Java Class Libraries (volumes one and two), and the Java Virtual
2615 Machine Specification.  In addition we've used the online documentation
2616 at @uref{http://java.sun.com/}.
2618 The current @command{gcj} home page is
2619 @uref{http://gcc.gnu.org/java/}.
2621 For more information on gcc, see @uref{http://gcc.gnu.org/}.
2623 Some @code{libgcj} testing is done using the Mauve test suite.  This is
2624 a free software Java class library test suite which is being written
2625 because the JCK is not free.  See
2626 @uref{http://sources.redhat.com/mauve/} for more information.
2628 @bye