OSDN Git Service

gcc/java/
[pf3gnuchains/gcc-fork.git] / gcc / java / gcj.texi
1 \input texinfo @c -*-texinfo-*-
2 @setfilename gcj.info
3 @settitle Guide to GNU gcj
4
5 @c Merge the standard indexes into a single one.
6 @syncodeindex fn cp
7 @syncodeindex vr cp
8 @syncodeindex ky cp
9 @syncodeindex pg cp
10 @syncodeindex tp cp
11
12 @include gcc-common.texi
13
14 @c Note: When reading this manual you'll find lots of strange
15 @c circumlocutions like ``compiler for the Java language''.
16 @c This is necessary due to Sun's restrictions on the use of
17 @c the word ``Java'.
18
19 @c When this manual is copyrighted.
20 @set copyrights-gcj 2001, 2002, 2003, 2004, 2005
21
22 @c Versions
23 @set which-gcj GCC-@value{version-GCC}
24
25 @copying
26 @c man begin COPYRIGHT
27 Copyright @copyright{} @value{copyrights-gcj} Free Software Foundation, Inc.
28
29 Permission is granted to copy, distribute and/or modify this document
30 under the terms of the GNU Free Documentation License, Version 1.2 or
31 any later version published by the Free Software Foundation; with the
32 Invariant Sections being ``GNU General Public License'', the Front-Cover
33 texts being (a) (see below), and with the Back-Cover Texts being (b)
34 (see below).  A copy of the license is included in the
35 @c man end
36 section entitled
37 ``GNU Free Documentation License''.
38 @ignore
39 @c man begin COPYRIGHT
40 man page gfdl(7).
41 @c man end
42 @end ignore
43
44 @c man begin COPYRIGHT
45
46 (a) The FSF's Front-Cover Text is:
47
48      A GNU Manual
49
50 (b) The FSF's Back-Cover Text is:
51
52      You have freedom to copy and modify this GNU Manual, like GNU
53      software.  Copies published by the Free Software Foundation raise
54      funds for GNU development.
55 @c man end
56 @end copying
57
58 @ifinfo
59 @format
60 @dircategory Programming
61 @direntry
62 * Gcj: (gcj).               Ahead-of-time compiler for the Java language
63 @end direntry
64
65 @dircategory Individual utilities
66 @direntry
67 * gcjh: (gcj)Invoking gcjh.
68                             Generate header files from Java class files
69 * gjnih: (gcj)Invoking gjnih.
70                             Generate JNI header files from Java class files
71 * jv-scan: (gcj)Invoking jv-scan.
72                             Print information about Java source files
73 * jcf-dump: (gcj)Invoking jcf-dump.
74                             Print information about Java class files
75 * gij: (gcj)Invoking gij.   GNU interpreter for Java bytecode
76 * gcj-dbtool: (gcj)Invoking gcj-dbtool.
77                             Tool for manipulating class file databases.
78 * jv-convert: (gcj)Invoking jv-convert.
79                             Convert file from one encoding to another
80 * grmic: (gcj)Invoking grmic.
81                             Generate stubs for Remote Method Invocation.
82 * grmiregistry: (gcj)Invoking grmiregistry.
83                             The remote object registry.
84 @end direntry
85 @end format
86
87 @insertcopying
88 @end ifinfo
89
90 @titlepage
91 @title GNU gcj
92 @author Tom Tromey
93
94 @page
95 @vskip 0pt plus 1filll
96 For the @value{which-gcj} Version*
97 @sp 1
98 Published by the Free Software Foundation @*
99 51 Franklin Street, Fifth Floor@*
100 Boston, MA 02110-1301, USA@*
101 @sp 1
102 @insertcopying
103 @end titlepage
104 @contents
105 @page
106
107
108 @node Top
109 @top Introduction
110
111 This manual describes how to use @command{gcj}, the GNU compiler for the
112 Java programming language.  @command{gcj} can generate both @file{.class}
113 files and object files, and it can read both Java source code and
114 @file{.class} files.
115
116 @menu
117 * Copying::              The GNU General Public License
118 * GNU Free Documentation License::
119                         How you can share and copy this manual
120 * Invoking gcj::        Compiler options supported by @command{gcj}
121 * Compatibility::       Compatibility between gcj and other tools for Java
122 * Invoking gcjh::       Generate header files from class files
123 * Invoking gjnih::      Generate JNI header files from class files
124 * Invoking jv-scan::    Print information about source files
125 * Invoking jcf-dump::   Print information about class files
126 * Invoking gij::        Interpreting Java bytecodes
127 * Invoking gcj-dbtool:: Tool for manipulating class file databases.
128 * Invoking jv-convert:: Converting from one encoding to another
129 * Invoking grmic::      Generate stubs for Remote Method Invocation.
130 * Invoking grmiregistry:: The remote object registry.
131 * About CNI::           Description of the Compiled Native Interface
132 * System properties::   Modifying runtime behavior of the libgcj library
133 * Resources::           Where to look for more information
134 * Index::               Index.
135 @end menu
136
137
138 @include gpl.texi
139
140 @include fdl.texi
141
142
143 @node Invoking gcj
144 @chapter Invoking gcj
145
146 @c man title gcj Ahead-of-time compiler for the Java language
147
148 @ignore
149 @c man begin SYNOPSIS gcj
150 gcj [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
151     [@option{--CLASSPATH}=@var{path}] [@option{--classpath}=@var{path}]
152     [@option{-f}@var{option}@dots{}] [@option{--encoding}=@var{name}]
153     [@option{--main}=@var{classname}] [@option{-D}@var{name}[=@var{value}]@dots{}]
154     [@option{-C}] [@option{--resource} @var{resource-name}] [@option{-d} @var{directory}]
155     [@option{-W}@var{warn}@dots{}]
156     @var{sourcefile}@dots{}
157 @c man end
158 @c man begin SEEALSO gcj
159 gcc(1), gcjh(1), gjnih(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
160 and the Info entries for @file{gcj} and @file{gcc}.
161 @c man end
162 @end ignore
163
164 @c man begin DESCRIPTION gcj
165
166 As @command{gcj} is just another front end to @command{gcc}, it supports many
167 of the same options as gcc.  @xref{Option Summary, , Option Summary,
168 gcc, Using the GNU Compiler Collection (GCC)}.  This manual only documents the
169 options specific to @command{gcj}.
170
171 @c man end
172
173 @menu
174 * Input and output files::
175 * Input Options::               How gcj finds files
176 * Encodings::                   Options controlling source file encoding
177 * Warnings::                    Options controlling warnings specific to gcj
178 * Linking::                     Options for making an executable
179 * Code Generation::             Options controlling the output of gcj
180 * Configure-time Options::      Options you won't use
181 @end menu
182
183 @c man begin OPTIONS gcj
184
185 @node Input and output files
186 @section Input and output files
187
188 A @command{gcj} command is like a @command{gcc} command, in that it
189 consists of a number of options and file names.  The following kinds
190 of input file names are supported:
191
192 @table @gcctabopt
193 @item @var{file}.java
194 Java source files.
195 @item @var{file}.class
196 Java bytecode files.
197 @item @var{file}.zip
198 @itemx @var{file}.jar
199 An archive containing one or more @code{.class} files, all of
200 which are compiled.  The archive may be compressed.  Files in
201 an archive which don't end with @samp{.class} are treated as
202 resource files; they are compiled into the resulting object file
203 as @samp{core:} URLs.
204 @item @@@var{file}
205 A file containing a whitespace-separated list of input file names.
206 (Currently, these must all be @code{.java} source files, but that
207 may change.)
208 Each named file is compiled, just as if it had been on the command line.
209 @item @var{library}.a
210 @itemx @var{library}.so
211 @itemx -l@var{libname}
212 Libraries to use when linking.  See the @command{gcc} manual.
213 @end table
214
215 You can specify more than one input file on the @command{gcj} command line,
216 in which case they will all be compiled.  If you specify a
217 @code{-o @var{FILENAME}}
218 option, all the input files will be compiled together, producing a
219 single output file, named @var{FILENAME}.
220 This is allowed even when using @code{-S} or @code{-c},
221 but not when using @code{-C} or @code{--resource}.
222 (This is an extension beyond the what plain @command{gcc} allows.)
223 (If more than one input file is specified, all must currently
224 be @code{.java} files, though we hope to fix this.)
225
226 @node Input Options
227 @section Input Options
228
229 @cindex class path
230
231 @command{gcj} has options to control where it looks to find files it needs.
232 For instance, @command{gcj} might need to load a class that is referenced
233 by the file it has been asked to compile.  Like other compilers for the
234 Java language, @command{gcj} has a notion of a @dfn{class path}.  There are
235 several options and environment variables which can be used to
236 manipulate the class path.  When @command{gcj} looks for a given class, it
237 searches the class path looking for matching @file{.class} or
238 @file{.java} file.  @command{gcj} comes with a built-in class path which
239 points at the installed @file{libgcj.jar}, a file which contains all the
240 standard classes.
241
242 In the below, a directory or path component can refer either to an
243 actual directory on the filesystem, or to a @file{.zip} or @file{.jar}
244 file, which @command{gcj} will search as if it is a directory.
245
246 @table @gcctabopt
247 @item -I@var{dir}
248 All directories specified by @code{-I} are kept in order and prepended
249 to the class path constructed from all the other options.  Unless
250 compatibility with tools like @code{javac} is important, we recommend
251 always using @code{-I} instead of the other options for manipulating the
252 class path.
253
254 @item --classpath=@var{path}
255 This sets the class path to @var{path}, a colon-separated list of paths
256 (on Windows-based systems, a semicolon-separate list of paths).
257 This does not override the builtin (``boot'') search path.
258
259 @item --CLASSPATH=@var{path}
260 Deprecated synonym for @code{--classpath}.
261
262 @item --bootclasspath=@var{path}
263 Where to find the standard builtin classes, such as @code{java.lang.String}.
264
265 @item --extdirs=@var{path}
266 For each directory in the @var{path}, place the contents of that
267 directory at the end of the class path.
268
269 @item CLASSPATH
270 This is an environment variable which holds a list of paths.
271 @end table
272
273 The final class path is constructed like so:
274
275 @itemize @bullet
276 @item
277 First come all directories specified via @code{-I}.
278
279 @item
280 If @option{--classpath} is specified, its value is appended.
281 Otherwise, if the @code{CLASSPATH} environment variable is specified,
282 then its value is appended.
283 Otherwise, the current directory (@code{"."}) is appended.
284
285 @item
286 If @code{--bootclasspath} was specified, append its value.
287 Otherwise, append the built-in system directory, @file{libgcj.jar}.
288
289 @item
290 Finally, if @code{--extdirs} was specified, append the contents of the
291 specified directories at the end of the class path.  Otherwise, append
292 the contents of the built-in extdirs at @code{$(prefix)/share/java/ext}.
293 @end itemize
294
295 The classfile built by @command{gcj} for the class @code{java.lang.Object}
296 (and placed in @code{libgcj.jar}) contains a special zero length
297 attribute @code{gnu.gcj.gcj-compiled}. The compiler looks for this
298 attribute when loading @code{java.lang.Object} and will report an error
299 if it isn't found, unless it compiles to bytecode (the option
300 @code{-fforce-classes-archive-check} can be used to override this
301 behavior in this particular case.)
302
303 @table @gcctabopt
304 @item -fforce-classes-archive-check
305 This forces the compiler to always check for the special zero length
306 attribute @code{gnu.gcj.gcj-compiled} in @code{java.lang.Object} and
307 issue an error if it isn't found.
308 @end table
309
310 @node Encodings
311 @section Encodings
312
313 The Java programming language uses Unicode throughout.  In an effort to
314 integrate well with other locales, @command{gcj} allows @file{.java} files
315 to be written using almost any encoding.  @command{gcj} knows how to
316 convert these encodings into its internal encoding at compile time.
317
318 You can use the @code{--encoding=@var{NAME}} option to specify an
319 encoding (of a particular character set) to use for source files.  If
320 this is not specified, the default encoding comes from your current
321 locale.  If your host system has insufficient locale support, then
322 @command{gcj} assumes the default encoding to be the @samp{UTF-8} encoding
323 of Unicode.
324
325 To implement @code{--encoding}, @command{gcj} simply uses the host
326 platform's @code{iconv} conversion routine.  This means that in practice
327 @command{gcj} is limited by the capabilities of the host platform.
328
329 The names allowed for the argument @code{--encoding} vary from platform
330 to platform (since they are not standardized anywhere).  However,
331 @command{gcj} implements the encoding named @samp{UTF-8} internally, so if
332 you choose to use this for your source files you can be assured that it
333 will work on every host.
334
335
336 @node Warnings
337 @section Warnings
338
339 @command{gcj} implements several warnings.  As with other generic
340 @command{gcc} warnings, if an option of the form @code{-Wfoo} enables a
341 warning, then @code{-Wno-foo} will disable it.  Here we've chosen to
342 document the form of the warning which will have an effect -- the
343 default being the opposite of what is listed.
344
345 @table @gcctabopt
346 @item -Wredundant-modifiers
347 With this flag, @command{gcj} will warn about redundant modifiers.  For
348 instance, it will warn if an interface method is declared @code{public}.
349
350 @item -Wextraneous-semicolon
351 This causes @command{gcj} to warn about empty statements.  Empty statements
352 have been deprecated.
353
354 @item -Wno-out-of-date
355 This option will cause @command{gcj} not to warn when a source file is
356 newer than its matching class file.  By default @command{gcj} will warn
357 about this.
358
359 @item -Wno-deprecated
360 Warn if a deprecated class, method, or field is referred to.
361
362 @item -Wunused
363 This is the same as @command{gcc}'s @code{-Wunused}.
364
365 @item -Wall
366 This is the same as @code{-Wredundant-modifiers -Wextraneous-semicolon
367 -Wunused}.
368 @end table
369
370
371 @node Linking
372 @section Linking
373
374 To turn a Java application into an executable program,
375 you need to link it with the needed libraries, just as for C or C++.
376 The linker by default looks for a global function named @code{main}.
377 Since Java does not have global functions, and a
378 collection of Java classes may have more than one class with a
379 @code{main} method, you need to let the linker know which of those
380 @code{main} methods it should invoke when starting the application.
381 You can do that in any of these ways:
382
383 @itemize @bullet
384 @item
385 Specify the class containing the desired @code{main} method
386 when you link the application, using the @code{--main} flag,
387 described below.
388 @item
389 Link the Java package(s) into a shared library (dll) rather than an
390 executable.  Then invoke the application using the @code{gij} program,
391 making sure that @code{gij} can find the libraries it needs.
392 @item
393 Link the Java packages(s) with the flag @code{-lgij}, which links
394 in the @code{main} routine from the @code{gij} command.
395 This allows you to select the class whose @code{main} method you
396 want to run when you run the application.  You can also use
397 other @code{gij} flags, such as @code{-D} flags to set properties.
398 Using the @code{-lgij} library (rather than the @code{gij} program
399 of the previous mechanism) has some advantages: it is compatible with
400 static linking, and does not require configuring or installing libraries.
401 @end itemize
402
403 These @code{gij} options relate to linking an executable:
404
405 @table @gcctabopt
406 @item --main=@var{CLASSNAME}
407 This option is used when linking to specify the name of the class whose
408 @code{main} method should be invoked when the resulting executable is
409 run.
410
411 @item -D@var{name}[=@var{value}]
412 This option can only be used with @code{--main}.  It defines a system
413 property named @var{name} with value @var{value}.  If @var{value} is not
414 specified then it defaults to the empty string.  These system properties
415 are initialized at the program's startup and can be retrieved at runtime
416 using the @code{java.lang.System.getProperty} method.
417
418 @item -lgij
419 Create an application whose command-line processing is that
420 of the @code{gij} command.
421
422 This option is an alternative to using @code{--main}; you cannot use both.
423
424 @item -static-libgcj
425 This option causes linking to be done against a static version of the
426 libgcj runtime library.  This option is only available if
427 corresponding linker support exists.
428
429 @strong{Caution:} Static linking of libgcj may cause essential parts
430 of libgcj to be omitted.  Some parts of libgcj use reflection to load
431 classes at runtime.  Since the linker does not see these references at
432 link time, it can omit the referred to classes.  The result is usually
433 (but not always) a @code{ClassNotFoundException} being thrown at
434 runtime. Caution must be used when using this option.  For more
435 details see:
436 @w{@uref{http://gcc.gnu.org/wiki/Statically%20linking%20libgcj}}
437 @end table
438
439 @node Code Generation
440 @section Code Generation
441
442 In addition to the many @command{gcc} options controlling code generation,
443 @command{gcj} has several options specific to itself.
444
445 @table @gcctabopt
446
447 @item -C
448 This option is used to tell @command{gcj} to generate bytecode
449 (@file{.class} files) rather than object code.
450
451 @item --resource @var{resource-name}
452 This option is used to tell @command{gcj} to compile the contents of a
453 given file to object code so it may be accessed at runtime with the core
454 protocol handler as @samp{core:/@var{resource-name}}.  Note that
455 @var{resource-name} is the name of the resource as found at runtime; for
456 instance, it could be used in a call to @code{ResourceBundle.getBundle}.
457 The actual file name to be compiled this way must be specified
458 separately.
459
460 @item -d @var{directory}
461 When used with @code{-C}, this causes all generated @file{.class} files
462 to be put in the appropriate subdirectory of @var{directory}.  By
463 default they will be put in subdirectories of the current working
464 directory.
465
466 @item -fno-bounds-check
467 By default, @command{gcj} generates code which checks the bounds of all
468 array indexing operations.  With this option, these checks are omitted, which
469 can improve performance for code that uses arrays extensively.  Note that this 
470 can result in unpredictable behavior if the code in question actually does 
471 violate array bounds constraints.  It is safe to use this option if you are 
472 sure that your code will never throw an @code{ArrayIndexOutOfBoundsException}.
473
474 @item -fno-store-check
475 Don't generate array store checks.  When storing objects into arrays, a runtime
476 check is normally generated in order to ensure that the object is assignment
477 compatible with the component type of the array (which may not be known
478 at compile-time).  With this option, these checks are omitted.  This can 
479 improve performance for code which stores objects into arrays frequently.
480 It is safe to use this option if you are sure your code will never throw an 
481 @code{ArrayStoreException}.
482
483 @item -fjni
484 With @command{gcj} there are two options for writing native methods: CNI
485 and JNI@.  By default @command{gcj} assumes you are using CNI@.  If you are
486 compiling a class with native methods, and these methods are implemented
487 using JNI, then you must use @code{-fjni}.  This option causes
488 @command{gcj} to generate stubs which will invoke the underlying JNI
489 methods.
490
491 @item -fno-assert
492 Don't recognize the @code{assert} keyword.  This is for compatibility
493 with older versions of the language specification.
494
495 @item -fno-optimize-static-class-initialization
496 When the optimization level is greater or equal to @code{-O2},
497 @command{gcj} will try to optimize the way calls into the runtime are made
498 to initialize static classes upon their first use (this optimization
499 isn't carried out if @code{-C} was specified.) When compiling to native
500 code, @code{-fno-optimize-static-class-initialization} will turn this
501 optimization off, regardless of the optimization level in use.
502
503 @item --disable-assertions[=@var{class-or-package}]
504 Don't include code for checking assertions in the compiled code.
505 If @code{=@var{class-or-package}} is missing disables assertion code
506 generation for all classes, unless overridden by a more
507 specific @code{--enable-assertions} flag.
508 If @var{class-or-package} is a class name, only disables generating
509 assertion checks within the named class or its inner classes.
510 If @var{class-or-package} is a package name, disables generating
511 assertion checks within the named package or a subpackage.
512
513 By default, assertions are enabled when generating class files
514 or when not optimizing, and disabled when generating optimized binaries.
515
516 @item --enable-assertions[=@var{class-or-package}]
517 Generates code to check assertions.  The option is perhaps misnamed,
518 as you still need to turn on assertion checking at run-time,
519 and we don't support any easy way to do that.
520 So this flag isn't very useful yet, except to partially override
521 @code{--disable-assertions}.
522
523 @item -findirect-dispatch
524 @command{gcj} has a special binary compatibility ABI, which is enabled
525 by the @code{-findirect-dispatch} option.  In this mode, the code
526 generated by @command{gcj} honors the binary compatibility guarantees
527 in the Java Language Specification, and the resulting object files do
528 not need to be directly linked against their dependencies.  Instead,
529 all dependencies are looked up at runtime.  This allows free mixing of
530 interpreted and compiled code.
531
532 Note that, at present, @code{-findirect-dispatch} can only be used
533 when compiling @file{.class} files.  It will not work when compiling
534 from source.  CNI also does not yet work with the binary compatibility
535 ABI.  These restrictions will be lifted in some future release.
536
537 However, if you compile CNI code with the standard ABI, you can call
538 it from code built with the binary compatibility ABI.
539
540 @item -fbootstrap-classes
541 This option can be use to tell @code{libgcj} that the compiled classes
542 should be loaded by the bootstrap loader, not the system class loader.
543 By default, if you compile a class and link it into an executable, it
544 will be treated as if it was loaded using the system class loader.
545 This is convenient, as it means that things like
546 @code{Class.forName()} will search @samp{CLASSPATH} to find the
547 desired class.
548
549 @end table
550
551
552 @node Configure-time Options
553 @section Configure-time Options
554
555 Some @command{gcj} code generations options affect the resulting ABI, and
556 so can only be meaningfully given when @code{libgcj}, the runtime
557 package, is configured.  @code{libgcj} puts the appropriate options from
558 this group into a @samp{spec} file which is read by @command{gcj}.  These
559 options are listed here for completeness; if you are using @code{libgcj}
560 then you won't want to touch these options.
561
562 @table @gcctabopt
563 @item -fuse-boehm-gc
564 This enables the use of the Boehm GC bitmap marking code.  In particular
565 this causes @command{gcj} to put an object marking descriptor into each
566 vtable.
567
568 @item -fhash-synchronization
569 By default, synchronization data (the data used for @code{synchronize},
570 @code{wait}, and @code{notify}) is pointed to by a word in each object.
571 With this option @command{gcj} assumes that this information is stored in a
572 hash table and not in the object itself.
573
574 @item -fuse-divide-subroutine
575 On some systems, a library routine is called to perform integer
576 division.  This is required to get exception handling correct when
577 dividing by zero.
578
579 @item -fcheck-references
580 On some systems it's necessary to insert inline checks whenever
581 accessing an object via a reference.  On other systems you won't need
582 this because null pointer accesses are caught automatically by the
583 processor.
584 @end table
585
586 @c man end
587
588 @node Compatibility
589 @chapter Compatibility with the Java Platform
590
591 As we believe it is important that the Java platform not be fragmented,
592 @command{gcj} and @code{libgcj} try to conform to the relevant Java
593 specifications.  However, limited manpower and incomplete and unclear
594 documentation work against us.  So, there are caveats to using
595 @command{gcj}.
596
597 @menu
598 * Limitations::                 
599 * Extensions::                  
600 @end menu
601
602 @node Limitations
603 @section Standard features not yet supported
604
605 This list of compatibility issues is by no means complete.
606
607 @itemize @bullet
608 @item
609 @command{gcj} implements the JDK 1.2 language.  It supports inner classes
610 and the new 1.4 @code{assert} keyword.  It does not yet support the Java 2
611 @code{strictfp} keyword (it recognizes the keyword but ignores it).  
612
613 @item
614 @code{libgcj} is largely compatible with the JDK 1.2 libraries.
615 However, @code{libgcj} is missing many packages, most notably
616 @code{java.awt}.  There are also individual missing classes and methods.
617 We currently do not have a list showing differences between
618 @code{libgcj} and the Java 2 platform.
619
620 @item
621 Sometimes the @code{libgcj} implementation of a method or class differs
622 from the JDK implementation.  This is not always a bug.  Still, if it
623 affects you, it probably makes sense to report it so that we can discuss
624 the appropriate response.
625
626 @item
627 @command{gcj} does not currently allow for piecemeal replacement of
628 components within @code{libgcj}. Unfortunately, programmers often want
629 to use newer versions of certain packages, such as those provided by
630 the Apache Software Foundation's Jakarta project.  This has forced us
631 to place the @code{org.w3c.dom} and @code{org.xml.sax} packages into
632 their own libraries, separate from @code{libgcj}.  If you intend to
633 use these classes, you must link them explicitly with
634 @code{-l-org-w3c-dom} and @code{-l-org-xml-sax}.  Future versions of
635 @command{gcj} may not have this restriction.
636 @end itemize
637
638 @node Extensions
639 @section Extra features unique to gcj
640
641 The main feature of @command{gcj} is that it can compile programs written in
642 the Java programming language to native code.  Most extensions that have been
643 added are to facilitate this functionality.
644
645 @itemize @bullet
646 @item
647 @command{gcj} makes it easy and efficient to mix code written in Java and C++.
648 @xref{About CNI}, for more info on how to use this in your programs.
649
650 @item
651 When you compile your classes into a shared library they can be automatically
652 loaded by the @code{libgcj} system classloader.  When trying to load a class
653 @code{gnu.pkg.SomeClass} the system classloader will first try to load the
654 shared library @file{lib-gnu-pkg-SomeClass.so}, if that fails to load the
655 class then it will try to load @file{lib-gnu-pkg.so} and finally when the
656 class is still not loaded it will try to load @file{lib-gnu.so}.  Note that
657 all @samp{.}s will be transformed into @samp{-}s and that searching
658 for inner classes starts with their outermost outer class.  If the class
659 cannot be found this way the system classloader tries to use
660 the @code{libgcj} bytecode interpreter to load the class from the standard
661 classpath.  This process can be controlled to some degree via the
662 @code{gnu.gcj.runtime.VMClassLoader.library_control} property;
663 @xref{libgcj Runtime Properties}.
664
665 @item
666 @code{libgcj} includes a special @samp{gcjlib} URL type.  A URL of
667 this form is like a @code{jar} URL, and looks like
668 @samp{gcjlib:/path/to/shared/library.so!/path/to/resource}.  An access
669 to one of these URLs causes the shared library to be @code{dlopen()}d,
670 and then the resource is looked for in that library.  These URLs are
671 most useful when used in conjunction with @code{java.net.URLClassLoader}.
672 Note that, due to implementation limitations, currently any such URL
673 can be accessed by only one class loader, and libraries are never
674 unloaded.  This means some care must be exercised to make sure that
675 a @code{gcjlib} URL is not accessed by more than one class loader at once.
676 In a future release this limitation will be lifted, and such
677 libraries will be mapped privately.
678
679 @item
680 A program compiled by @command{gcj} will examine the
681 @env{GCJ_PROPERTIES} environment variable and change its behavior in
682 some ways.  In particular @env{GCJ_PROPERTIES} holds a list of
683 assignments to global properties, such as would be set with the
684 @option{-D} option to @command{java}.  For instance,
685 @samp{java.compiler=gcj} is a valid (but currently meaningless)
686 setting.
687 @cindex GCJ_PROPERTIES
688 @vindex GCJ_PROPERTIES
689
690 @end itemize
691
692
693 @node Invoking gcjh
694 @chapter Invoking gcjh
695
696 @c man title gcjh generate header files from Java class files
697
698 @c man begin DESCRIPTION gcjh
699
700 The @code{gcjh} program is used to generate header files from class
701 files.  It can generate both CNI and JNI header files, as well as stub
702 implementation files which can be used as a basis for implementing the
703 required native methods.
704
705 @c man end
706
707 @ignore
708 @c man begin SYNOPSIS gcjh
709 gcjh [@option{-stubs}] [@option{-jni}]
710     [@option{-force}] [@option{-old}] [@option{-trace}] [@option{-J} @var{option}]
711     [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}]
712     [@option{-preprend} @var{text}]
713     [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
714     [@option{--bootclasspath}=@var{path}]
715     [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
716     [@option{-o} @var{file}] [@option{-td} @var{dir}]
717     [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}]
718     [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
719     @var{classname}@dots{}
720 @c man end
721 @c man begin SEEALSO gcjh
722 gcc(1), gcj(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
723 and the Info entries for @file{gcj} and @file{gcc}.
724 @c man end
725 @end ignore
726
727 @c man begin OPTIONS gcjh
728
729 @table @gcctabopt
730 @item -stubs
731 This causes @code{gcjh} to generate stub files instead of header files.
732 By default the stub file will be named after the class, with a suffix of
733 @samp{.cc}.  In JNI mode, the default output file will have the suffix
734 @samp{.c}.
735
736 @item -jni
737 This tells @code{gcjh} to generate a JNI header or stub.  By default,
738 CNI headers are generated.
739
740 @item -force
741 This option forces @code{gcjh} to write the output file.
742
743 @item -old
744 This option is accepted but ignored for compatibility.
745
746 @item -trace
747 This option is accepted but ignored for compatibility.
748
749 @item -J @var{option}
750 This option is accepted but ignored for compatibility.
751
752 @item -add @var{text}
753 Inserts @var{text} into the class body.  This is ignored in JNI mode.
754
755 @item -append @var{text}
756 Inserts @var{text} into the header file after the class declaration.
757 This is ignored in JNI mode.
758
759 @item -friend @var{text}
760 Inserts @var{text} into the class as a @code{friend} declaration.
761 This is ignored in JNI mode.
762
763 @item -prepend @var{text}
764 Inserts @var{text} into the header file before the class declaration.
765 This is ignored in JNI mode.
766
767 @item --classpath=@var{path}
768 @itemx --CLASSPATH=@var{path}
769 @itemx --bootclasspath=@var{path}
770 @itemx -I@var{directory}
771 @itemx -d @var{directory}
772 @itemx -o @var{file}
773 These options are all identical to the corresponding @command{gcj} options.
774
775 @item -o @var{file}
776 Sets the output file name.  This cannot be used if there is more than
777 one class on the command line.
778
779 @item -td @var{directory}
780 Sets the name of the directory to use for temporary files.
781
782 @item -M
783 Print all dependencies to stdout; suppress ordinary output.
784
785 @item -MM
786 Print non-system dependencies to stdout; suppress ordinary output.
787
788 @item -MD
789 Print all dependencies to stdout.
790
791 @item -MMD
792 Print non-system dependencies to stdout.
793
794 @item --help
795 Print help about @code{gcjh} and exit.  No further processing is done.
796
797 @item --version
798 Print version information for @code{gcjh} and exit.  No further
799 processing is done.
800
801 @item -v, --verbose
802 Print extra information while running.
803 @end table
804
805 All remaining options are considered to be names of classes.
806
807 @c man end
808
809 @node Invoking gjnih
810 @chapter Invoking gjnih
811
812 @c man title gjnih generate JNI header files from Java class files
813
814 @c man begin DESCRIPTION gjnih
815
816 The @code{gjnih} program is used to generate JNI header files from class
817 files.  Running it is equivalent to running @code{gcjh -jni}.
818
819 @c man end
820
821 @ignore
822 @c man begin SYNOPSIS gjnih
823 gjnih [@option{-stubs}] [@option{-jni}]
824     [@option{-force}] [@option{-old}] [@option{-trace}] [@option{-J} @var{option}]
825     [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}]
826     [@option{-preprend} @var{text}]
827     [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
828     [@option{--bootclasspath}=@var{path}]
829     [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}]
830     [@option{-o} @var{file}] [@option{-td} @var{dir}]
831     [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}]
832     [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
833     @var{classname}@dots{}
834 @c man end
835 @c man begin SEEALSO gjnih
836 gcc(1), gcj(1), gcjh(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7),
837 and the Info entries for @file{gcj} and @file{gcc}.
838 @c man end
839 @end ignore
840
841 @c man begin OPTIONS gjnih
842
843 @table @gcctabopt
844 @item -stubs
845 This causes @code{gjnih} to generate stub files instead of header files.
846 By default the stub file will be named after the class, with a suffix of
847 @samp{.c}.
848
849 @item -jni
850 This option specifies the default behavior which is to generate a JNI
851 header or stub.
852
853 @item -force
854 This option forces @code{gjnih} to write the output file.
855
856 @item -old
857 This option is accepted but ignored for compatibility.
858
859 @item -trace
860 This option is accepted but ignored for compatibility.
861
862 @item -J @var{option}
863 This option is accepted but ignored for compatibility.
864
865 @item -add @var{text}
866 Inserts @var{text} into the class body.  This is ignored in by
867 @code{gjnih}.
868
869 @item -append @var{text}
870 Inserts @var{text} into the header file after the class declaration.
871 This is ignored in by @code{gjnih}.
872
873 @item -friend @var{text}
874 Inserts @var{text} into the class as a @code{friend} declaration.
875 This is ignored by @code{gjnih}.
876
877 @item -prepend @var{text}
878 Inserts @var{text} into the header file before the class declaration.
879 This is ignored in by @code{gjnih}.
880
881 @item --classpath=@var{path}
882 @itemx --CLASSPATH=@var{path}
883 @itemx --bootclasspath=@var{path}
884 @itemx -I@var{directory}
885 @itemx -d @var{directory}
886 @itemx -o @var{file}
887 These options are all identical to the corresponding @command{gcj} options.
888
889 @item -o @var{file}
890 Sets the output file name.  This cannot be used if there is more than
891 one class on the command line.
892
893 @item -td @var{directory}
894 Sets the name of the directory to use for temporary files.
895
896 @item -M
897 Print all dependencies to stdout; suppress ordinary output.
898
899 @item -MM
900 Print non-system dependencies to stdout; suppress ordinary output.
901
902 @item -MD
903 Print all dependencies to stdout.
904
905 @item -MMD
906 Print non-system dependencies to stdout.
907
908 @item --help
909 Print help about @code{gjnih} and exit.  No further processing is done.
910
911 @item --version
912 Print version information for @code{gjnih} and exit.  No further
913 processing is done.
914
915 @item -v, --verbose
916 Print extra information while running.
917 @end table
918
919 All remaining options are considered to be names of classes.
920
921 @c man end
922
923 @node Invoking jv-scan
924 @chapter Invoking jv-scan
925
926 @c man title jv-scan print information about Java source file
927
928 @c man begin DESCRIPTION jv-scan
929
930 The @code{jv-scan} program can be used to print information about a Java
931 source file (@file{.java} file).
932
933 @c man end
934
935 @ignore
936 @c man begin SYNOPSIS jv-scan
937 jv-scan [@option{--no-assert}] [@option{--complexity}] 
938     [@option{--encoding}=@var{name}] [@option{--print-main}] 
939     [@option{--list-class}] [@option{--list-filename}]
940     [@option{--version}] [@option{--help}]
941     [@option{-o} @var{file}] @var{inputfile}@dots{}
942 @c man end
943 @c man begin SEEALSO jv-scan
944 gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
945 and the Info entries for @file{gcj} and @file{gcc}.
946 @c man end
947 @end ignore
948
949 @c man begin OPTIONS jv-scan
950
951 @table @gcctabopt
952 @item --no-assert
953 Don't recognize the @code{assert} keyword, for backwards compatibility
954 with older versions of the language specification.
955
956 @item --complexity
957 This prints a complexity measure, related to cyclomatic complexity, for
958 each input file.
959
960 @item --encoding=@var{name}
961 This works like the corresponding @command{gcj} option.
962
963 @item --print-main
964 This prints the name of the class in this file containing a @code{main}
965 method.
966
967 @item --list-class
968 This lists the names of all classes defined in the input files.
969
970 @item --list-filename
971 If @code{--list-class} is given, this option causes @code{jv-scan} to
972 also print the name of the file in which each class was found.
973
974 @item -o @var{file}
975 Print output to the named file.
976
977 @item --help
978 Print help, then exit.
979
980 @item --version
981 Print version number, then exit.
982 @end table
983
984 @c man end
985
986 @node Invoking jcf-dump
987 @chapter Invoking jcf-dump
988
989 @c man title jcf-dump print information about Java class files
990
991 @ignore
992 @c man begin SYNOPSIS jcf-dump
993 jcf-dump [@option{-c}] [@option{--javap}]
994     [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}]
995     [@option{-I}@var{dir}@dots{}] [@option{-o} @var{file}]
996     [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}]
997     @var{classname}@dots{}
998 @c man end
999 @c man begin SEEALSO jcf-dump
1000 gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7),
1001 and the Info entries for @file{gcj} and @file{gcc}.
1002 @c man end
1003 @end ignore
1004
1005 @c man begin DESCRIPTION jcf-dump
1006
1007 This is a class file examiner, similar to @code{javap}.  It will print
1008 information about a number of classes, which are specified by class name
1009 or file name.
1010
1011 @c man end
1012
1013 @c man begin OPTIONS jcf-dump
1014
1015 @table @gcctabopt
1016 @item -c
1017 Disassemble method bodies.  By default method bodies are not printed.
1018
1019 @item --print-constants
1020 Print the constant pool.  When printing a reference to a constant
1021 also print its index in the constant pool.
1022
1023 @item --javap
1024 Generate output in @code{javap} format.  The implementation of this
1025 feature is very incomplete.
1026
1027 @item --classpath=@var{path}
1028 @itemx --CLASSPATH=@var{path}
1029 @itemx -I@var{directory}
1030 @itemx -o @var{file}
1031 These options as the same as the corresponding @command{gcj} options.
1032
1033 @item --help
1034 Print help, then exit.
1035
1036 @item --version
1037 Print version number, then exit.
1038
1039 @item -v, --verbose
1040 Print extra information while running.
1041 Implies @code{--print-constants}.
1042 @end table
1043
1044 @c man end
1045
1046 @node Invoking gij
1047 @chapter Invoking gij
1048
1049 @c man title gij GNU interpreter for Java bytecode
1050
1051 @ignore
1052 @c man begin SYNOPSIS gij
1053 gij [@option{OPTION}] @dots{} @var{JARFILE} [@var{ARGS}@dots{}]
1054
1055 gij [@option{-jar}] [@option{OPTION}] @dots{} @var{CLASS} [@var{ARGS}@dots{}]
1056   [@option{-cp} @var{path}] [@option{-classpath} @var{path}]
1057   [@option{-D}@var{name}[=@var{value}]@dots{}]
1058   [@option{-ms=}@var{number}] [@option{-mx=}@var{number}]
1059   [@option{-X@var{argument}}] [@option{-verbose}] [@option{-verbose:class}]
1060   [@option{--showversion}] [@option{--version}] [@option{--help}][@option{-?}]
1061 @c man end
1062 @c man begin SEEALSO gij
1063 gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
1064 and the Info entries for @file{gcj} and @file{gcc}.
1065 @c man end
1066 @end ignore
1067
1068 @c man begin DESCRIPTION gij
1069
1070 @code{gij} is a Java bytecode interpreter included with @code{libgcj}.
1071 @code{gij} is not available on every platform; porting it requires a
1072 small amount of assembly programming which has not been done for all the
1073 targets supported by @command{gcj}.
1074
1075 The primary argument to @code{gij} is the name of a class or, with
1076 @code{-jar}, a jar file.  Options before this argument are interpreted
1077 by @code{gij}; remaining options are passed to the interpreted program.
1078
1079 If a class name is specified and this class does not have a @code{main}
1080 method with the appropriate signature (a @code{static void} method with
1081 a @code{String[]} as its sole argument), then @code{gij} will print an
1082 error and exit.
1083
1084 If a jar file is specified then @code{gij} will use information in it to
1085 determine which class' @code{main} method will be invoked.
1086
1087 @code{gij} will invoke the @code{main} method with all the remaining
1088 command-line options.
1089
1090 Note that @code{gij} is not limited to interpreting code.  Because
1091 @code{libgcj} includes a class loader which can dynamically load shared
1092 objects, it is possible to give @code{gij} the name of a class which has
1093 been compiled and put into a shared library on the class path.
1094
1095 @c man end
1096
1097 @c man begin OPTIONS gij
1098
1099 @table @gcctabopt
1100 @item -cp @var{path}
1101 @itemx -classpath @var{path}
1102 Set the initial class path.  The class path is used for finding
1103 class and resource files.  If specified, this option overrides the
1104 @code{CLASSPATH} environment variable.  Note that this option is
1105 ignored if @code{-jar} is used.
1106
1107 @item -D@var{name}[=@var{value}]
1108 This defines a system property named @var{name} with value @var{value}.
1109 If @var{value} is not specified then it defaults to the empty string.
1110 These system properties are initialized at the program's startup and can
1111 be retrieved at runtime using the @code{java.lang.System.getProperty}
1112 method.
1113
1114 @item -ms=@var{number}
1115 Equivalent to @code{-Xms}.
1116
1117 @item -mx=@var{number}
1118 Equivalent to @code{-Xmx}.
1119
1120 @item -noverify
1121 Do not verify compliance of bytecode with the VM specification. In addition,
1122 this option disables type verification which is otherwise performed on BC-ABI
1123 compiled code.
1124
1125 @item -X
1126 @itemx -X@var{argument}
1127 Supplying @code{-X} by itself will cause @code{gij} to list all the
1128 supported @code{-X} options.  Currently these options are supported:
1129
1130 @table @gcctabopt
1131 @item -Xms@var{size}
1132 Set the initial heap size.
1133
1134 @item -Xmx@var{size}
1135 Set the maximum heap size.
1136
1137 @item -Xss@var{size}
1138 Set the thread stack size.
1139 @end table
1140
1141 Unrecognized @code{-X} options are ignored, for compatibility with
1142 other runtimes.
1143
1144 @item -jar
1145 This indicates that the name passed to @code{gij} should be interpreted
1146 as the name of a jar file, not a class.
1147
1148 @item --help
1149 @itemx -?
1150 Print help, then exit.
1151
1152 @item --showversion
1153 Print version number and continue.
1154
1155 @item --fullversion
1156 Print detailed version information, then exit.
1157
1158 @item --version
1159 Print version number, then exit.
1160
1161 @item -verbose
1162 @itemx -verbose:class
1163 Each time a class is initialized, print a short message on standard error.
1164 @end table
1165
1166 @code{gij} also recognizes and ignores the following options, for
1167 compatibility with existing application launch scripts:
1168 @code{-client}, @code{-server}, @code{-hotspot}, @code{-jrockit},
1169 @code{-agentlib}, @code{-agentpath}, @code{-debug}, @code{-d32},
1170 @code{-d64}, @code{-javaagent}, @code{-noclassgc}, @code{-verify},
1171 and @code{-verifyremote}.
1172
1173 @c man end
1174
1175 @node Invoking gcj-dbtool
1176 @chapter Invoking gcj-dbtool.
1177
1178 @c man title gcj-dbtool Manipulate class file mapping databases for libgcj
1179
1180 @ignore
1181 @c man begin SYNOPSIS gcj-dbtool
1182 gcj-dbtool @option{OPTION} @var{DBFILE} [@option{MORE}] @dots{}
1183
1184 gcj-dbtool [@option{-0}] [@option{-}] [@option{-n}] [@option{-a}] [@option{-f}]
1185   [@option{-t}] [@option{-l}] [@option{-p} [@var{LIBDIR}]]
1186   [@option{-v}] [@option{-m}] [@option{--version}] [@option{--help}]
1187
1188 @c man end
1189 @c man begin SEEALSO gij
1190 gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7),
1191 and the Info entries for @file{gcj} and @file{gcc}.
1192 @c man end
1193 @end ignore
1194
1195 @c man begin DESCRIPTION gcj-dbtool
1196
1197 @code{gcj-dbtool} is a tool for creating and manipulating class file
1198 mapping databases.  @code{libgcj} can use these databases to find a
1199 shared library corresponding to the bytecode representation of a
1200 class.  This functionality is useful for ahead-of-time compilation of
1201 a program that has no knowledge of @code{gcj}.
1202
1203 @code{gcj-dbtool} works best if all the jar files added to it are
1204 compiled using @code{-findirect-dispatch}.
1205
1206 Note that @code{gcj-dbtool} is currently available as ``preview
1207 technology''.  We believe it is a reasonable way to allow
1208 application-transparent ahead-of-time compilation, but this is an
1209 unexplored area.  We welcome your comments.
1210
1211 @c man end
1212
1213 @c man begin OPTIONS gcj-dbtool
1214
1215 @table @gcctabopt
1216 @item -n @var{DBFILE} [@var{SIZE}]
1217 This creates a new database.  Currently, databases cannot be resized;
1218 you can choose a larger initial size if desired.  The default size is
1219 32,749.
1220
1221 @item -a @var{DBFILE} @var{JARFILE} @var{LIB}
1222 @itemx -f @var{DBFILE} @var{JARFILE} @var{LIB}
1223 This adds a jar file to the database.  For each class file in the jar,
1224 a cryptographic signature of the bytecode representation of the class
1225 is recorded in the database.  At runtime, a class is looked up by its
1226 signature and the compiled form of the class is looked for in the
1227 corresponding shared library.  The @option{-a} option will verify
1228 that @var{LIB} exists before adding it to the database; @option{-f}
1229 skips this check.
1230
1231 @item [@option{-}][@option{-0}] -m @var{DBFILE} @var{DBFILE},[@var{DBFILE}]
1232 Merge a number of databases.  The output database overwrites any
1233 existing database.  To add databases into an existing database,
1234 include the destination in the list of sources.
1235
1236 If @option{-} or @option{-0} are used, the list of files to read is
1237 taken from standard input instead of the command line.  For
1238 @option{-0}, Input filenames are terminated by a null character
1239 instead of by whitespace.  Useful when arguments might contain white
1240 space.  The GNU find -print0 option produces input suitable for this
1241 mode.
1242
1243 @item -t @var{DBFILE}
1244 Test a database.
1245
1246 @item -l @var{DBFILE}
1247 List the contents of a database.
1248
1249 @item -p
1250 Print the name of the default database.  If there is no default
1251 database, this prints a blank line.  If @var{LIBDIR} is specified, use
1252 it instead of the default library directory component of the database
1253 name.
1254
1255 @item --help
1256 Print a help message, then exit.
1257
1258 @item --version
1259 @itemx -v
1260 Print version information, then exit.
1261
1262 @end table
1263
1264 @c man end
1265
1266 @node Invoking jv-convert
1267 @chapter Invoking jv-convert
1268
1269 @c man title jv-convert Convert file from one encoding to another
1270
1271 @c man begin SYNOPSIS jv-convert
1272 @command{jv-convert} [@option{OPTION}] @dots{} [@var{INPUTFILE} [@var{OUTPUTFILE}]]
1273 @ignore
1274
1275   [@option{--encoding} @var{name}]
1276   [@option{--from} @var{name}]
1277   [@option{--to} @var{name}]
1278   [@option{-i} @var{file}] [@option{-o} @var{file}]
1279   [@option{--reverse}] [@option{--help}] [@option{--version}]
1280 @end ignore
1281 @c man end
1282
1283 @c man begin DESCRIPTION jv-convert
1284
1285 @command{jv-convert} is a utility included with @code{libgcj} which
1286 converts a file from one encoding to another.  It is similar to the Unix
1287 @command{iconv} utility.
1288
1289 The encodings supported by @command{jv-convert} are platform-dependent.
1290 Currently there is no way to get a list of all supported encodings.
1291
1292 @c man end
1293
1294 @c man begin OPTIONS jv-convert
1295
1296 @table @gcctabopt
1297 @item --encoding @var{name}
1298 @itemx --from @var{name}
1299 Use @var{name} as the input encoding.  The default is the current
1300 locale's encoding.
1301
1302 @item --to @var{name}
1303 Use @var{name} as the output encoding.  The default is the
1304 @code{JavaSrc} encoding; this is ASCII with @samp{\u} escapes for
1305 non-ASCII characters.
1306
1307 @item -i @var{file}
1308 Read from @var{file}.  The default is to read from standard input.
1309
1310 @item -o @var{file}
1311 Write to @var{file}.  The default is to write to standard output.
1312
1313 @item --reverse
1314 Swap the input and output encodings.
1315
1316 @item --help
1317 Print a help message, then exit.
1318
1319 @item --version
1320 Print version information, then exit.
1321 @end table
1322
1323 @c man end
1324
1325 @node Invoking grmic
1326 @chapter Invoking grmic
1327
1328 @c man title grmic Generate stubs for Remote Method Invocation
1329
1330 @c man begin SYNOPSIS grmic
1331 @command{grmic} [@option{OPTION}] @dots{} @var{class} @dots{}
1332 @ignore
1333   [@option{-keep}]
1334   [@option{-keepgenerated}]
1335   [@option{-v1.1}]
1336   [@option{-vcompat}]
1337   [@option{-v1.2}]
1338   [@option{-nocompile}]
1339   [@option{-verbose}]
1340   [@option{-d} @var{directory}]
1341   [@option{-help}]
1342   [@option{-version}]
1343 @end ignore
1344 @c man end
1345
1346 @c man begin DESCRIPTION grmic
1347
1348 @command{grmic} is a utility included with @code{libgcj} which generates
1349 stubs for remote objects.
1350
1351 @c FIXME: Add real information here.
1352 @c This really isn't much more than the --help output.
1353
1354 Note that this program isn't yet fully compatible with the JDK
1355 @command{grmic}.  Some options, such as @option{-classpath}, are
1356 recognized but currently ignored.  We have left these options
1357 undocumented for now.
1358
1359 Long options can also be given with a GNU-style leading @samp{--}.  For
1360 instance, @option{--help} is accepted.
1361
1362 @c man end
1363
1364 @c man begin OPTIONS grmic
1365
1366 @table @gcctabopt
1367 @item -keep
1368 @itemx -keepgenerated
1369 By default, @command{grmic} deletes intermediate files.  Either of these
1370 options causes it not to delete such files.
1371
1372 @item -v1.1
1373 Cause @command{grmic} to create stubs and skeletons for the 1.1
1374 protocol version.
1375
1376 @item -vcompat
1377 Cause @command{grmic} to create stubs and skeletons compatible with both
1378 the 1.1 and 1.2 protocol versions.  This is the default.
1379
1380 @item -v1.2
1381 Cause @command{grmic} to create stubs and skeletons for the 1.2
1382 protocol version.
1383
1384 @item -nocompile
1385 Don't compile the generated files.
1386
1387 @item -verbose
1388 Print information about what @command{grmic} is doing.
1389
1390 @item -d @var{directory}
1391 Put output files in @var{directory}.  By default the files are put in
1392 the current working directory.
1393
1394 @item -help
1395 Print a help message, then exit.
1396
1397 @item -version
1398 Print version information, then exit.
1399 @end table
1400
1401 @c man end
1402
1403
1404 @node Invoking grmiregistry
1405 @chapter Invoking grmiregistry
1406
1407 @c man title grmiregistry Remote object registry
1408
1409 @c man begin SYNOPSIS grmiregistry
1410 @command{grmic} [@option{OPTION}] @dots{} [@var{port}]
1411 @ignore
1412   [@option{--help}]
1413   [@option{--version}]
1414 @end ignore
1415 @c man end
1416
1417 @c man begin DESCRIPTION grmiregistry
1418
1419 @command{grmiregistry} starts a remote object registry on the current
1420 host.  If no port number is specified, then port 1099 is used.
1421
1422 @c FIXME: Add real information here.
1423 @c This really isn't much more than the --help output.
1424
1425 @c man end
1426
1427 @c man begin OPTIONS grmiregistry
1428
1429 @table @gcctabopt
1430 @item --help
1431 Print a help message, then exit.
1432
1433 @item --version
1434 Print version information, then exit.
1435 @end table
1436
1437 @c man end
1438
1439
1440 @node About CNI
1441 @chapter About CNI
1442
1443 This documents CNI, the Compiled Native Interface,
1444 which is is a convenient way to write Java native methods using C++.
1445 This is a more efficient, more convenient, but less portable
1446 alternative to the standard JNI (Java Native Interface).
1447
1448 @menu
1449 * Basic concepts::              Introduction to using CNI@.
1450 * Packages::                    How packages are mapped to C++.
1451 * Primitive types::             Handling primitive Java types in C++.
1452 * Reference types::             Handling Java reference types in C++.
1453 * Interfaces::                  How Java interfaces map to C++.
1454 * Objects and Classes::         C++ and Java classes.
1455 * Class Initialization::        How objects are initialized.
1456 * Object allocation::           How to create Java objects in C++.
1457 * Memory allocation::           How to allocate and free memory.
1458 * Arrays::                      Dealing with Java arrays in C++.
1459 * Methods::                     Java methods in C++.
1460 * Strings::                     Information about Java Strings.
1461 * Mixing with C++::             How CNI can interoperate with C++.
1462 * Exception Handling::          How exceptions are handled.
1463 * Synchronization::             Synchronizing between Java and C++.
1464 * Invocation::                  Starting the Java runtime from C++.
1465 * Reflection::                  Using reflection from C++.
1466 @end menu
1467
1468
1469 @node Basic concepts
1470 @section Basic concepts
1471
1472 In terms of languages features, Java is mostly a subset
1473 of C++.  Java has a few important extensions, plus a powerful standard
1474 class library, but on the whole that does not change the basic similarity.
1475 Java is a hybrid object-oriented language, with a few native types,
1476 in addition to class types.  It is class-based, where a class may have
1477 static as well as per-object fields, and static as well as instance methods.
1478 Non-static methods may be virtual, and may be overloaded.  Overloading is
1479 resolved at compile time by matching the actual argument types against
1480 the parameter types.  Virtual methods are implemented using indirect calls
1481 through a dispatch table (virtual function table).  Objects are
1482 allocated on the heap, and initialized using a constructor method.
1483 Classes are organized in a package hierarchy.
1484
1485 All of the listed attributes are also true of C++, though C++ has
1486 extra features (for example in C++ objects may be allocated not just
1487 on the heap, but also statically or in a local stack frame).  Because
1488 @command{gcj} uses the same compiler technology as G++ (the GNU
1489 C++ compiler), it is possible to make the intersection of the two
1490 languages use the same ABI (object representation and calling
1491 conventions).  The key idea in CNI is that Java objects are C++
1492 objects, and all Java classes are C++ classes (but not the other way
1493 around).  So the most important task in integrating Java and C++ is to
1494 remove gratuitous incompatibilities.
1495
1496 You write CNI code as a regular C++ source file.  (You do have to use
1497 a Java/CNI-aware C++ compiler, specifically a recent version of G++.)
1498
1499 @noindent A CNI C++ source file must have:
1500
1501 @example
1502 #include <gcj/cni.h>
1503 @end example
1504
1505 @noindent and then must include one header file for each Java class it uses, e.g.:
1506
1507 @example
1508 #include <java/lang/Character.h>
1509 #include <java/util/Date.h>
1510 #include <java/lang/IndexOutOfBoundsException.h>
1511 @end example
1512
1513 @noindent These header files are automatically generated by @code{gcjh}.
1514
1515
1516 CNI provides some functions and macros to make using Java objects and
1517 primitive types from C++ easier.  In general, these CNI functions and
1518 macros start with the @code{Jv} prefix, for example the function
1519 @code{JvNewObjectArray}.  This convention is used to avoid conflicts
1520 with other libraries.  Internal functions in CNI start with the prefix
1521 @code{_Jv_}.  You should not call these; if you find a need to, let us
1522 know and we will try to come up with an alternate solution.
1523
1524
1525 @subsection Limitations
1526
1527 Whilst a Java class is just a C++ class that doesn't mean that you are
1528 freed from the shackles of Java, a @acronym{CNI} C++ class must adhere to the
1529 rules of the Java programming language.
1530
1531 For example: it is not possible to declare a method in a CNI class
1532 that will take a C string (@code{char*}) as an argument, or to declare a
1533 member variable of some non-Java datatype.
1534
1535
1536 @node Packages
1537 @section Packages
1538
1539 The only global names in Java are class names, and packages.  A
1540 @dfn{package} can contain zero or more classes, and also zero or more
1541 sub-packages.  Every class belongs to either an unnamed package or a
1542 package that has a hierarchical and globally unique name.
1543
1544 A Java package is mapped to a C++ @dfn{namespace}.  The Java class
1545 @code{java.lang.String} is in the package @code{java.lang}, which is a
1546 sub-package of @code{java}.  The C++ equivalent is the class
1547 @code{java::lang::String}, which is in the namespace @code{java::lang}
1548 which is in the namespace @code{java}.
1549
1550 @noindent Here is how you could express this:
1551
1552 @example
1553 (// @r{Declare the class(es), possibly in a header file:}
1554 namespace java @{
1555   namespace lang @{
1556     class Object;
1557     class String;
1558     ...
1559   @}
1560 @}
1561
1562 class java::lang::String : public java::lang::Object
1563 @{
1564   ...
1565 @};
1566 @end example
1567
1568 @noindent The @code{gcjh} tool automatically generates the necessary namespace
1569 declarations.
1570
1571
1572 @subsection Leaving out package names
1573
1574 Always using the fully-qualified name of a java class can be
1575 tiresomely verbose.  Using the full qualified name also ties the code
1576 to a single package making code changes necessary should the class
1577 move from one package to another.  The Java @code{package} declaration
1578 specifies that the following class declarations are in the named
1579 package, without having to explicitly name the full package
1580 qualifiers.  The @code{package} declaration can be
1581 followed by zero or more @code{import} declarations, which
1582 allows either a single class or all the classes in a package to be
1583 named by a simple identifier.  C++ provides something similar with the
1584 @code{using} declaration and directive.
1585
1586 @noindent In Java:
1587
1588 @example
1589 import @var{package-name}.@var{class-name};
1590 @end example
1591
1592 @noindent allows the program text to refer to @var{class-name} as a shorthand for 
1593 the fully qualified name: @code{@var{package-name}.@var{class-name}}.
1594
1595
1596 @noindent To achieve the same effect C++, you have to do this:
1597
1598 @example
1599 using @var{package-name}::@var{class-name};
1600 @end example
1601
1602
1603 @noindent Java can also cause imports on demand, like this:
1604
1605 @example
1606 import @var{package-name}.*;
1607 @end example
1608
1609 @noindent Doing this allows any class from the package @var{package-name} to be
1610 referred to only by its class-name within the program text.
1611
1612
1613 @noindent The same effect can be achieved in C++ like this:
1614
1615 @example
1616 using namespace @var{package-name};
1617 @end example
1618
1619
1620 @node Primitive types
1621 @section Primitive types
1622
1623 Java provides 8 @dfn{primitives} types which represent integers, floats, 
1624 characters and booleans (and also the void type).  C++ has its own
1625 very similar concrete types.  Such types in C++ however are not always
1626 implemented in the same way (an int might be 16, 32 or 64 bits for example) 
1627 so CNI provides a special C++ type for each primitive Java type:
1628
1629 @multitable @columnfractions .20 .25 .60
1630 @item @strong{Java type}   @tab @strong{C/C++ typename} @tab @strong{Description}
1631 @item @code{char}        @tab @code{jchar}          @tab 16 bit Unicode character
1632 @item @code{boolean}     @tab @code{jboolean}       @tab logical (true or false) values
1633 @item @code{byte}        @tab @code{jbyte}          @tab 8-bit signed integer
1634 @item @code{short}       @tab @code{jshort}         @tab 16 bit signed integer
1635 @item @code{int}         @tab @code{jint}           @tab 32 bit signed integer
1636 @item @code{long}        @tab @code{jlong}          @tab 64 bit signed integer
1637 @item @code{float}       @tab @code{jfloat}         @tab 32 bit IEEE floating point number
1638 @item @code{double}      @tab @code{jdouble}        @tab 64 bit IEEE floating point number
1639 @item @code{void}        @tab @code{void}           @tab no value
1640 @end multitable
1641
1642 When referring to a Java type You should always use these C++ typenames (e.g.: @code{jint})
1643 to avoid disappointment.
1644
1645
1646 @subsection Reference types associated with primitive types
1647
1648 In Java each primitive type has an associated reference type, 
1649 e.g.: @code{boolean} has an associated @code{java.lang.Boolean.TYPE} class.
1650 In order to make working with such classes easier GCJ provides the macro
1651 @code{JvPrimClass}:
1652
1653 @deffn macro JvPrimClass type
1654 Return a pointer to the @code{Class} object corresponding to the type supplied.
1655
1656 @example
1657 JvPrimClass(void) @result{} java.lang.Void.TYPE
1658 @end example
1659
1660 @end deffn
1661
1662
1663 @node Reference types
1664 @section Reference types
1665
1666 A Java reference type is treated as a class in C++.  Classes and
1667 interfaces are handled this way.  A Java reference is translated to a
1668 C++ pointer, so for instance a Java @code{java.lang.String} becomes,
1669 in C++, @code{java::lang::String *}.
1670
1671 CNI provides a few built-in typedefs for the most common classes:
1672 @multitable @columnfractions .30 .25 .60
1673 @item @strong{Java type} @tab @strong{C++ typename} @tab @strong{Description}
1674 @item @code{java.lang.Object} @tab @code{jobject} @tab Object type
1675 @item @code{java.lang.String} @tab @code{jstring} @tab String type
1676 @item @code{java.lang.Class} @tab @code{jclass} @tab Class type
1677 @end multitable
1678 @cindex jobject
1679 @cindex jstring
1680 @cindex jclass
1681
1682 Every Java class or interface has a corresponding @code{Class}
1683 instance.  These can be accessed in CNI via the static @code{class$}
1684 field of a class.  The @code{class$} field is of type @code{Class}
1685 (and not @code{Class *}), so you will typically take the address of
1686 it.
1687 @cindex class$
1688
1689 Here is how you can refer to the class of @code{String}, which in
1690 Java would be written @code{String.class}:
1691
1692 @example
1693 using namespace java::lang;
1694 doSomething (&String::class$);
1695 @end example
1696
1697
1698 @node Interfaces
1699 @section Interfaces
1700
1701 A Java class can @dfn{implement} zero or more
1702 @dfn{interfaces}, in addition to inheriting from
1703 a single base class. 
1704
1705 @acronym{CNI} allows CNI code to implement methods of interfaces.
1706 You can also call methods through interface references, with some
1707 limitations.
1708
1709 @acronym{CNI} doesn't understand interface inheritance at all yet.  So,
1710 you can only call an interface method when the declared type of the
1711 field being called matches the interface which declares that
1712 method.  The workaround is to cast the interface reference to the right
1713 superinterface.
1714  
1715 For example if you have: 
1716
1717 @example 
1718 interface A 
1719 @{ 
1720   void a(); 
1721 @} 
1722  
1723 interface B extends A 
1724 @{ 
1725   void b(); 
1726 @} 
1727 @end example
1728  
1729 and declare a variable of type @code{B} in C++, you can't call
1730 @code{a()} unless you cast it to an @code{A} first.
1731
1732 @node Objects and Classes
1733 @section Objects and Classes
1734
1735 @subsection Classes
1736
1737 All Java classes are derived from @code{java.lang.Object}.  C++ does
1738 not have a unique root class, but we use the C++ class
1739 @code{java::lang::Object} as the C++ version of the
1740 @code{java.lang.Object} Java class.  All other Java classes are mapped
1741 into corresponding C++ classes derived from @code{java::lang::Object}.
1742
1743 Interface inheritance (the @code{implements} keyword) is currently not
1744 reflected in the C++ mapping.
1745
1746
1747 @subsection Object fields
1748
1749 Each object contains an object header, followed by the instance fields
1750 of the class, in order.  The object header consists of a single
1751 pointer to a dispatch or virtual function table.  (There may be extra
1752 fields @emph{in front of} the object, for example for memory
1753 management, but this is invisible to the application, and the
1754 reference to the object points to the dispatch table pointer.)
1755
1756 The fields are laid out in the same order, alignment, and size as in
1757 C++.  Specifically, 8-bit and 16-bit native types (@code{byte},
1758 @code{short}, @code{char}, and @code{boolean}) are @emph{not} widened
1759 to 32 bits.  Note that the Java VM does extend 8-bit and 16-bit types
1760 to 32 bits when on the VM stack or temporary registers.
1761
1762 If you include the @code{gcjh}-generated header for a
1763 class, you can access fields of Java classes in the @emph{natural}
1764 way.  For example, given the following Java class:
1765
1766 @example
1767 public class Int
1768 @{
1769   public int i;
1770   public Int (int i) @{ this.i = i; @}
1771   public static Int zero = new Int(0);
1772 @}
1773 @end example
1774
1775 you can write:
1776
1777 @example
1778 #include <gcj/cni.h>;
1779 #include <Int>;
1780
1781 Int*
1782 mult (Int *p, jint k)
1783 @{
1784   if (k == 0)
1785     return Int::zero;  // @r{Static member access.}
1786   return new Int(p->i * k);
1787 @}
1788 @end example
1789
1790
1791 @subsection Access specifiers
1792
1793 CNI does not strictly enforce the Java access
1794 specifiers, because Java permissions cannot be directly mapped
1795 into C++ permission.  Private Java fields and methods are mapped
1796 to private C++ fields and methods, but other fields and methods
1797 are mapped to public fields and methods.
1798
1799
1800
1801 @node Class Initialization
1802 @section Class Initialization
1803
1804 Java requires that each class be automatically initialized at the time 
1805 of the first active use.  Initializing a class involves 
1806 initializing the static fields, running code in class initializer 
1807 methods, and initializing base classes.  There may also be 
1808 some implementation specific actions, such as allocating 
1809 @code{String} objects corresponding to string literals in
1810 the code.
1811
1812 The GCJ compiler inserts calls to @code{JvInitClass} at appropriate
1813 places to ensure that a class is initialized when required.  The C++
1814 compiler does not insert these calls automatically---it is the
1815 programmer's responsibility to make sure classes are initialized.
1816 However, this is fairly painless because of the conventions assumed by
1817 the Java system.
1818
1819 First, @code{libgcj} will make sure a class is initialized before an
1820 instance of that object is created.  This is one of the
1821 responsibilities of the @code{new} operation.  This is taken care of
1822 both in Java code, and in C++ code.  When G++ sees a @code{new} of a
1823 Java class, it will call a routine in @code{libgcj} to allocate the
1824 object, and that routine will take care of initializing the class.
1825 Note however that this does not happen for Java arrays; you must
1826 allocate those using the appropriate CNI function.  It follows that
1827 you can access an instance field, or call an instance (non-static)
1828 method and be safe in the knowledge that the class and all of its base
1829 classes have been initialized.
1830
1831 Invoking a static method is also safe.  This is because the
1832 Java compiler adds code to the start of a static method to make sure
1833 the class is initialized.  However, the C++ compiler does not
1834 add this extra code.  Hence, if you write a native static method
1835 using CNI, you are responsible for calling @code{JvInitClass}
1836 before doing anything else in the method (unless you are sure
1837 it is safe to leave it out).
1838
1839 Accessing a static field also requires the class of the
1840 field to be initialized.  The Java compiler will generate code
1841 to call @code{JvInitClass} before getting or setting the field.
1842 However, the C++ compiler will not generate this extra code,
1843 so it is your responsibility to make sure the class is
1844 initialized before you access a static field from C++.
1845
1846
1847 @node Object allocation
1848 @section Object allocation
1849
1850 New Java objects are allocated using a
1851 @dfn{class instance creation expression}, e.g.:
1852
1853 @example
1854 new @var{Type} ( ... )
1855 @end example
1856
1857 The same syntax is used in C++.  The main difference is that
1858 C++ objects have to be explicitly deleted; in Java they are
1859 automatically deleted by the garbage collector.
1860 Using @acronym{CNI}, you can allocate a new Java object
1861 using standard C++ syntax and the C++ compiler will allocate
1862 memory from the garbage collector.  If you have overloaded
1863 constructors, the compiler will choose the correct one
1864 using standard C++ overload resolution rules.  
1865
1866 @noindent For example:
1867
1868 @example
1869 java::util::Hashtable *ht = new java::util::Hashtable(120);
1870 @end example
1871
1872
1873 @node Memory allocation
1874 @section Memory allocation
1875
1876 When allocating memory in @acronym{CNI} methods it is best to handle
1877 out-of-memory conditions by throwing a Java exception.  These
1878 functions are provided for that purpose:
1879
1880 @deftypefun void* JvMalloc (jsize @var{size})
1881 Calls malloc.  Throws @code{java.lang.OutOfMemoryError} if allocation
1882 fails.
1883 @end deftypefun
1884
1885 @deftypefun void* JvRealloc (void* @var{ptr}, jsize @var{size})
1886 Calls realloc.  Throws @code{java.lang.OutOfMemoryError} if
1887 reallocation fails.
1888 @end deftypefun
1889
1890 @deftypefun void JvFree (void* @var{ptr})
1891 Calls free.
1892 @end deftypefun
1893
1894 @node Arrays
1895 @section Arrays
1896
1897 While in many ways Java is similar to C and C++, it is quite different
1898 in its treatment of arrays.  C arrays are based on the idea of pointer
1899 arithmetic, which would be incompatible with Java's security
1900 requirements.  Java arrays are true objects (array types inherit from
1901 @code{java.lang.Object}).  An array-valued variable is one that
1902 contains a reference (pointer) to an array object.
1903
1904 Referencing a Java array in C++ code is done using the
1905 @code{JArray} template, which as defined as follows:
1906
1907 @example
1908 class __JArray : public java::lang::Object
1909 @{
1910 public:
1911   int length;
1912 @};
1913
1914 template<class T>
1915 class JArray : public __JArray
1916 @{
1917   T data[0];
1918 public:
1919   T& operator[](jint i) @{ return data[i]; @}
1920 @};
1921 @end example
1922
1923
1924 There are a number of @code{typedef}s which correspond to @code{typedef}s 
1925 from the @acronym{JNI}.  Each is the type of an array holding objects
1926 of the relevant type:
1927
1928 @example
1929 typedef __JArray *jarray;
1930 typedef JArray<jobject> *jobjectArray;
1931 typedef JArray<jboolean> *jbooleanArray;
1932 typedef JArray<jbyte> *jbyteArray;
1933 typedef JArray<jchar> *jcharArray;
1934 typedef JArray<jshort> *jshortArray;
1935 typedef JArray<jint> *jintArray;
1936 typedef JArray<jlong> *jlongArray;
1937 typedef JArray<jfloat> *jfloatArray;
1938 typedef JArray<jdouble> *jdoubleArray;
1939 @end example
1940
1941
1942 @deftypemethod {template<class T>} T* elements (JArray<T> @var{array})
1943 This template function can be used to get a pointer to the elements of
1944 the @code{array}.  For instance, you can fetch a pointer to the
1945 integers that make up an @code{int[]} like so:
1946
1947 @example
1948 extern jintArray foo;
1949 jint *intp = elements (foo);
1950 @end example
1951
1952 The name of this function may change in the future.
1953 @end deftypemethod
1954
1955
1956 @deftypefun jobjectArray JvNewObjectArray (jsize @var{length}, jclass @var{klass}, jobject @var{init})
1957 This creates a new array whose elements have reference type.
1958 @code{klass} is the type of elements of the array and
1959 @code{init} is the initial value put into every slot in the array.
1960 @end deftypefun
1961
1962 @example
1963 using namespace java::lang;
1964 JArray<String *> *array
1965   = (JArray<String *> *) JvNewObjectArray(length, &String::class$, NULL);
1966 @end example
1967
1968
1969 @subsection Creating arrays
1970
1971 For each primitive type there is a function which can be used to
1972 create a new array of that type.  The name of the function is of the
1973 form:
1974
1975 @example
1976 JvNew@var{Type}Array
1977 @end example
1978
1979 @noindent For example:
1980
1981 @example
1982 JvNewBooleanArray
1983 @end example
1984
1985 @noindent can be used to create an array of Java primitive boolean types.
1986
1987 @noindent The following function definition is the template for all such functions:
1988
1989 @deftypefun jbooleanArray JvNewBooleanArray (jint @var{length})
1990 Create's an array @var{length} indices long.
1991 @end deftypefun
1992
1993 @deftypefun jsize JvGetArrayLength (jarray @var{array})
1994 Returns the length of the @var{array}.
1995 @end deftypefun
1996
1997
1998 @node Methods
1999 @section Methods
2000
2001 Java methods are mapped directly into C++ methods.
2002 The header files generated by @code{gcjh}
2003 include the appropriate method definitions.
2004 Basically, the generated methods have the same names and
2005 @emph{corresponding} types as the Java methods,
2006 and are called in the natural manner.
2007
2008 @subsection Overloading
2009
2010 Both Java and C++ provide method overloading, where multiple
2011 methods in a class have the same name, and the correct one is chosen
2012 (at compile time) depending on the argument types.
2013 The rules for choosing the correct method are (as expected) more complicated
2014 in C++ than in Java, but given a set of overloaded methods
2015 generated by @code{gcjh} the C++ compiler will choose
2016 the expected one.
2017
2018 Common assemblers and linkers are not aware of C++ overloading,
2019 so the standard implementation strategy is to encode the
2020 parameter types of a method into its assembly-level name.
2021 This encoding is called @dfn{mangling},
2022 and the encoded name is the @dfn{mangled name}.
2023 The same mechanism is used to implement Java overloading.
2024 For C++/Java interoperability, it is important that both the Java
2025 and C++ compilers use the @emph{same} encoding scheme.
2026
2027 @subsection Static methods
2028
2029 Static Java methods are invoked in @acronym{CNI} using the standard
2030 C++ syntax, using the @code{::} operator rather
2031 than the @code{.} operator.  
2032
2033 @noindent For example:
2034
2035 @example
2036 jint i = java::lang::Math::round((jfloat) 2.3);
2037 @end example
2038
2039 @noindent C++ method definition syntax is used to define a static native method.
2040 For example:
2041
2042 @example
2043 #include <java/lang/Integer>
2044 java::lang::Integer*
2045 java::lang::Integer::getInteger(jstring str)
2046 @{
2047   ...
2048 @}
2049 @end example
2050
2051
2052 @subsection Object Constructors
2053
2054 Constructors are called implicitly as part of object allocation
2055 using the @code{new} operator.  
2056
2057 @noindent For example:
2058
2059 @example
2060 java::lang::Integer *x = new java::lang::Integer(234);
2061 @end example
2062
2063 Java does not allow a constructor to be a native method.
2064 This limitation can be coded round however because a constructor
2065 can @emph{call} a native method.
2066
2067
2068 @subsection Instance methods
2069
2070 Calling a Java instance method from a C++ @acronym{CNI} method is done 
2071 using the standard C++ syntax, e.g.:
2072
2073 @example
2074 // @r{First create the Java object.}
2075 java::lang::Integer *x = new java::lang::Integer(234);
2076 // @r{Now call a method.}
2077 jint prim_value = x->intValue();
2078 if (x->longValue == 0) 
2079   ...
2080 @end example
2081
2082 @noindent Defining a Java native instance method is also done the natural way:
2083
2084 @example
2085 #include <java/lang/Integer.h>
2086
2087 jdouble
2088 java::lang:Integer::doubleValue()
2089 @{
2090   return (jdouble) value;
2091 @}
2092 @end example
2093
2094
2095 @subsection Interface methods
2096
2097 In Java you can call a method using an interface reference.  This is
2098 supported, but not completely.  @xref{Interfaces}.
2099
2100
2101
2102
2103 @node Strings
2104 @section Strings
2105
2106 @acronym{CNI} provides a number of utility functions for
2107 working with Java Java @code{String} objects.
2108 The names and interfaces are analogous to those of @acronym{JNI}.
2109
2110
2111 @deftypefun jstring JvNewString (const char* @var{chars}, jsize @var{len})
2112 Returns a Java @code{String} object with characters from the C string
2113 @var{chars} up to the index @var{len} in that array.
2114 @end deftypefun
2115
2116 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}, jsize @var{len})
2117 Returns a Java @code{String} made up of @var{len} bytes from @var{bytes}.
2118 @end deftypefun
2119
2120
2121 @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes})
2122 As above but the length of the @code{String} is @code{strlen(@var{bytes})}.
2123 @end deftypefun
2124
2125 @deftypefun jstring JvNewStringUTF (const char* @var{bytes})
2126 Returns a @code{String} which is made up of the UTF encoded characters
2127 present in the C string @var{bytes}.
2128 @end deftypefun
2129
2130 @deftypefun jchar* JvGetStringChars (jstring @var{str})
2131 Returns a pointer to an array of characters making up the @code{String} @var{str}.
2132 @end deftypefun
2133
2134 @deftypefun int JvGetStringUTFLength (jstring @var{str})
2135 Returns the number of bytes required to encode the contents of the
2136 @code{String} @var{str} in UTF-8.
2137 @end deftypefun
2138
2139 @deftypefun jsize JvGetStringUTFRegion (jstring @var{str}, jsize @var{start}, jsize @var{len}, char* @var{buf})
2140 Puts the UTF-8 encoding of a region of the @code{String} @var{str} into 
2141 the buffer @code{buf}.  The region to fetch is marked by @var{start} and @var{len}.
2142
2143 Note that @var{buf} is a buffer, not a C string.  It is @emph{not} 
2144 null terminated.
2145 @end deftypefun
2146
2147
2148 @node Mixing with C++
2149 @section Interoperating with C/C++
2150
2151 Because @acronym{CNI} is designed to represent Java classes and methods it
2152 cannot be mixed readily with C/C++ types.
2153
2154 One important restriction is that Java classes cannot have non-Java
2155 type instance or static variables and cannot have methods which take
2156 non-Java types as arguments or return non-Java types.
2157
2158 @noindent None of the following is possible with CNI:
2159
2160 @example
2161
2162 class ::MyClass : public java::lang::Object
2163 @{
2164    char* variable;  // @r{char* is not a valid Java type.}
2165 @}
2166
2167
2168 uint
2169 ::SomeClass::someMethod (char *arg)
2170 @{
2171   .
2172   .
2173   .
2174 @}   // @r{@code{uint} is not a valid Java type, neither is @code{char*}}
2175 @end example
2176
2177 @noindent Of course, it is ok to use C/C++ types within the scope of a method:
2178
2179
2180 @example
2181 jint
2182 ::SomeClass::otherMethod (jstring str)
2183 @{
2184    char *arg = ...
2185    .
2186    .
2187    .
2188 @}
2189 @end example
2190
2191 @subsection RawData
2192
2193 The above restriction can be problematic, so @acronym{CNI} includes the
2194 @code{gnu.gcj.RawData} class.  The @code{RawData} class is a
2195 @dfn{non-scanned reference} type.  In other words variables declared
2196 of type @code{RawData} can contain any data and are not checked by the
2197 compiler or memory manager in any way.
2198
2199 This means that you can put C/C++ data structures (including classes)
2200 in your @acronym{CNI} classes, as long as you use the appropriate cast.
2201
2202 @noindent Here are some examples:
2203
2204 @example
2205
2206 class ::MyClass : public java::lang::Object
2207 @{
2208    gnu.gcj.RawData string;
2209
2210    MyClass ();
2211    gnu.gcj.RawData getText ();
2212    void printText ();
2213 @}
2214
2215 ::MyClass::MyClass ()
2216 @{
2217    char* text = ...
2218    string = text;
2219 @}
2220
2221 gnu.gcj.RawData
2222 ::MyClass::getText ()
2223 @{
2224    return string;
2225 @}
2226
2227 void
2228 ::MyClass::printText ()
2229 @{
2230   printf("%s\n", (char*) string);
2231 @}
2232 @end example
2233
2234
2235 @subsection RawDataManaged
2236
2237 @code{gnu.gcj.RawDataManaged} is another type used to indicate special data used 
2238 by native code. Unlike the @code{RawData} type, fields declared as 
2239 @code{RawDataManaged} will be "marked" by the memory manager and 
2240 considered for garbage collection.  
2241
2242 Native data which is allocated using CNI's @code{JvAllocBytes()}
2243 function and stored in a @code{RawDataManaged} will be automatically 
2244 freed when the Java object it is associated with becomes unreachable.
2245
2246 @subsection Native memory allocation
2247
2248 @deftypefun void* JvAllocBytes (jsize @var{size})
2249 Allocates @var{size} bytes from the heap.  The memory returned is zeroed.
2250 This memory is not scanned for pointers by the garbage collector, but will 
2251 be freed if no references to it are discovered.
2252
2253 This function can be useful if you need to associate some native data with a
2254 Java object. Using a CNI's special @code{RawDataManaged} type, native data 
2255 allocated with @code{JvAllocBytes} will be automatically freed when the Java 
2256 object itself becomes unreachable.
2257 @end deftypefun
2258
2259 @subsection Posix signals
2260
2261 On Posix based systems the @code{libgcj} library uses several signals
2262 internally.  @acronym{CNI} code should not attempt to use the same
2263 signals as doing so may cause @code{libgcj} and/or the @acronym{CNI}
2264 code to fail.
2265
2266 SIGSEGV is used on many systems to generate
2267 @code{NullPointerExceptions}.  SIGCHLD is used internally by
2268 @code{Runtime.exec()}.  Several other signals (that vary from platform to
2269 platform) can be used by the memory manager and by
2270 @code{Thread.interrupt()}.
2271
2272 @node Exception Handling
2273 @section Exception Handling
2274
2275 While C++ and Java share a common exception handling framework,
2276 things are not yet perfectly integrated.  The main issue is that the
2277 run-time type information facilities of the two
2278 languages are not integrated.
2279
2280 Still, things work fairly well.  You can throw a Java exception from
2281 C++ using the ordinary @code{throw} construct, and this
2282 exception can be caught by Java code.  Similarly, you can catch an
2283 exception thrown from Java using the C++ @code{catch}
2284 construct.
2285
2286 @noindent Here is an example:
2287
2288 @example
2289 if (i >= count)
2290    throw new java::lang::IndexOutOfBoundsException();
2291 @end example
2292
2293 Normally, G++ will automatically detect when you are writing C++
2294 code that uses Java exceptions, and handle them appropriately.
2295 However, if C++ code only needs to execute destructors when Java
2296 exceptions are thrown through it, GCC will guess incorrectly.  Sample
2297 problematic code:
2298
2299 @example
2300 struct S @{ ~S(); @};
2301
2302 extern void bar();    // @r{Is implemented in Java and may throw exceptions.}
2303
2304 void foo()
2305 @{
2306   S s;
2307   bar();
2308 @}
2309 @end example
2310
2311 The usual effect of an incorrect guess is a link failure, complaining of
2312 a missing routine called @code{__gxx_personality_v0}.
2313
2314 You can inform the compiler that Java exceptions are to be used in a
2315 translation unit, irrespective of what it might think, by writing
2316 @code{#pragma GCC java_exceptions} at the head of the
2317 file.  This @code{#pragma} must appear before any
2318 functions that throw or catch exceptions, or run destructors when
2319 exceptions are thrown through them.
2320
2321 @node Synchronization
2322 @section Synchronization
2323
2324 Each Java object has an implicit monitor.
2325 The Java VM uses the instruction @code{monitorenter} to acquire
2326 and lock a monitor, and @code{monitorexit} to release it.
2327
2328 The corresponding CNI macros are @code{JvMonitorEnter} and 
2329 @code{JvMonitorExit} (JNI has similar  methods @code{MonitorEnter}
2330 and @code{MonitorExit}).  
2331
2332
2333 The Java source language does not provide direct access to these primitives.
2334 Instead, there is a @code{synchronized} statement that does an
2335 implicit @code{monitorenter} before entry to the block,
2336 and does a @code{monitorexit} on exit from the block.
2337 Note that the lock has to be released even when the block is abnormally
2338 terminated by an exception, which means there is an implicit
2339 @code{try finally} surrounding synchronization locks.
2340
2341 From C++, it makes sense to use a destructor to release a lock.
2342 @acronym{CNI} defines the following utility class:
2343
2344 @example
2345 class JvSynchronize() @{
2346   jobject obj;
2347   JvSynchronize(jobject o) @{ obj = o; JvMonitorEnter(o); @}
2348   ~JvSynchronize() @{ JvMonitorExit(obj); @}
2349 @};
2350 @end example
2351
2352 So this Java code:
2353
2354 @example
2355 synchronized (OBJ)
2356 @{
2357    CODE
2358 @}
2359 @end example
2360
2361 @noindent might become this C++ code:
2362
2363 @example
2364 @{
2365    JvSynchronize dummy (OBJ);
2366    CODE;
2367 @}
2368 @end example
2369
2370 Java also has methods with the @code{synchronized} attribute.
2371 This is equivalent to wrapping the entire method body in a
2372 @code{synchronized} statement.
2373 (Alternatively, an implementation could require the caller to do
2374 the synchronization.  This is not practical for a compiler, because
2375 each virtual method call would have to test at run-time if
2376 synchronization is needed.)  Since in @command{gcj}
2377 the @code{synchronized} attribute is handled by the
2378 method implementation, it is up to the programmer
2379 of a synchronized native method to handle the synchronization
2380 (in the C++ implementation of the method).
2381 In other words, you need to manually add @code{JvSynchronize}
2382 in a @code{native synchronized} method.
2383
2384 @node Invocation
2385 @section Invocation
2386
2387 CNI permits C++ applications to make calls into Java classes, in addition to
2388 allowing Java code to call into C++. Several functions, known as the 
2389 @dfn{invocation API}, are provided to support this.
2390
2391 @deftypefun jint JvCreateJavaVM (JvVMInitArgs* @var{vm_args})
2392
2393 Initializes the Java runtime. This function performs essential initialization
2394 of the threads interface, garbage collector, exception handling and other key
2395 aspects of the runtime. It must be called once by an application with
2396 a non-Java @code{main()} function, before any other Java or CNI calls are made.
2397 It is safe, but not recommended, to call @code{JvCreateJavaVM()} more than
2398 once provided it is only called from a single thread.
2399 The @var{vmargs} parameter can be used to specify initialization parameters 
2400 for the Java runtime. It may be @code{NULL}.
2401
2402 JvVMInitArgs represents a list of virtual machine initialization
2403 arguments. @code{JvCreateJavaVM()} ignores the version field.
2404
2405 @example
2406 typedef struct JvVMOption
2407 @{
2408   // a VM initialization option
2409   char* optionString;
2410   // extra information associated with this option
2411   void* extraInfo;
2412 @} JvVMOption;
2413
2414 typedef struct JvVMInitArgs
2415 @{
2416   // for compatibility with JavaVMInitArgs
2417   jint version;
2418
2419   // number of VM initialization options
2420   jint nOptions;
2421
2422   // an array of VM initialization options
2423   JvVMOption* options;
2424
2425   // true if the option parser should ignore unrecognized options
2426   jboolean ignoreUnrecognized;
2427 @} JvVMInitArgs;
2428 @end example
2429
2430 @code{JvCreateJavaVM()} returns @code{0} upon success, or @code{-1} if
2431 the runtime is already initialized.
2432
2433 @emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It
2434 is recognized and used as of release 4.0.
2435 @end deftypefun
2436
2437 @deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group})
2438 Registers an existing thread with the Java runtime.  This must be called once
2439 from each thread, before that thread makes any other Java or CNI calls. It
2440 must be called after @code{JvCreateJavaVM}.
2441 @var{name} specifies a name for the thread. It may be @code{NULL}, in which 
2442 case a name will be generated.
2443 @var{group} is the ThreadGroup in which this thread will be a member. If it
2444 is @code{NULL}, the thread will be a member of the main thread group.
2445 The return value is the Java @code{Thread} object that represents the thread.
2446 It is safe to call @code{JvAttachCurrentThread()} more than once from the same
2447 thread. If the thread is already attached, the call is ignored and the current
2448 thread object is returned.
2449 @end deftypefun
2450
2451 @deftypefun jint JvDetachCurrentThread ()
2452 Unregisters a thread from the Java runtime. This should be called by threads
2453 that were attached using @code{JvAttachCurrentThread()}, after they have 
2454 finished making calls to Java code. This ensures that any resources associated
2455 with the thread become eligible for garbage collection.
2456 This function returns @code{0} upon success, or @code{-1} if the current thread
2457 is not attached.
2458 @end deftypefun
2459
2460 @subsection Handling uncaught exceptions
2461
2462 If an exception is thrown from Java code called using the invocation API, and
2463 no handler for the exception can be found, the runtime will abort the
2464 application. In order to make the application more robust, it is recommended 
2465 that code which uses the invocation API be wrapped by a top-level try/catch 
2466 block that catches all Java exceptions.
2467
2468 @subsection Example
2469
2470 The following code demonstrates the use of the invocation API. In this
2471 example, the C++ application initializes the Java runtime and attaches
2472 itself. The @code{java.lang.System} class is initialized in order to
2473 access its @code{out} field, and a Java string is printed. Finally, the thread
2474 is detached from the runtime once it has finished making Java calls. Everything
2475 is wrapped with a try/catch block to provide a default handler for any uncaught 
2476 exceptions.
2477
2478 The example can be compiled with @command{c++ test.cc -lgcj}.
2479
2480 @example
2481 // test.cc
2482 #include <gcj/cni.h>
2483 #include <java/lang/System.h>
2484 #include <java/io/PrintStream.h>
2485 #include <java/lang/Throwable.h>
2486
2487 int main(int argc, char *argv)
2488 @{
2489   using namespace java::lang;
2490   
2491   try
2492   @{
2493     JvCreateJavaVM(NULL);
2494     JvAttachCurrentThread(NULL, NULL);
2495
2496     String *message = JvNewStringLatin1("Hello from C++");
2497     JvInitClass(&System::class$);
2498     System::out->println(message);
2499
2500     JvDetachCurrentThread();
2501   @}
2502   catch (Throwable *t)
2503   @{
2504     System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
2505     t->printStackTrace();
2506   @}
2507 @}
2508 @end example
2509
2510 @node Reflection
2511 @section Reflection
2512
2513 Reflection is possible with CNI code, it functions similarly to how it
2514 functions with JNI@.
2515
2516 @c clean this up...  I mean, what are the types jfieldID and jmethodID in JNI?
2517 The types @code{jfieldID} and @code{jmethodID}
2518 are as in JNI@.
2519
2520 @noindent The functions:
2521
2522 @itemize
2523 @item @code{JvFromReflectedField},
2524 @item @code{JvFromReflectedMethod},
2525 @item @code{JvToReflectedField}
2526 @item @code{JvToFromReflectedMethod}
2527 @end itemize
2528
2529 @noindent will be added shortly, as will other functions corresponding to JNI@.
2530
2531
2532 @node System properties
2533 @chapter System properties
2534
2535 The runtime behavior of the @code{libgcj} library can be modified by setting
2536 certain system properties.  These properties can be compiled into the program
2537 using the @code{-D@var{name}[=@var{value}]} option to @command{gcj} or by
2538 setting them explicitly in the program by calling the
2539 @code{java.lang.System.setProperty()} method.  Some system properties are only
2540 used for informational purposes (like giving a version number or a user name).
2541 A program can inspect the current value of a property by calling the
2542 @code{java.lang.System.getProperty()} method.
2543
2544 @menu
2545 * Standard Properties::         Standard properties supported by @code{libgcj}
2546 * GNU Classpath Properties::    Properties found in Classpath based libraries
2547 * libgcj Runtime Properties::   Properties specific to @code{libgcj}
2548 @end menu
2549
2550 @node Standard Properties
2551 @section Standard Properties
2552
2553 The following properties are normally found in all implementations of the core
2554 libraries for the Java language.
2555
2556 @table @gcctabopt
2557
2558 @item java.version
2559 The @code{libgcj} version number.
2560
2561 @item java.vendor
2562 Set to @samp{The Free Software Foundation, Inc.}
2563
2564 @item java.vendor.url
2565 Set to @uref{http://gcc.gnu.org/java/}.
2566
2567 @item java.home
2568 The directory where @code{gcj} was installed.  Taken from the @code{--prefix}
2569 option given to @command{configure}.
2570
2571 @item java.class.version
2572 The class format version number supported by the libgcj byte code interpreter.
2573 (Currently @samp{46.0})
2574
2575 @item java.vm.specification.version
2576 The Virtual Machine Specification version implemented by @code{libgcj}.
2577 (Currently @samp{1.0})
2578
2579 @item java.vm.specification.vendor
2580 The name of the Virtual Machine specification designer.
2581
2582 @item java.vm.specification.name
2583 The name of the Virtual Machine specification
2584 (Set to @samp{Java Virtual Machine Specification}).
2585
2586 @item java.vm.version
2587 The @command{gcj} version number.
2588
2589 @item java.vm.vendor
2590 Set to @samp{The Free Software Foundation, Inc.}
2591
2592 @item java.vm.name
2593 Set to @samp{GNU libgcj}.
2594
2595 @item java.specification.version
2596 The Runtime Environment specification version implemented by @code{libgcj}.
2597 (Currently set to @samp{1.3})
2598
2599 @item java.specification.vendor
2600 The Runtime Environment specification designer.
2601
2602 @item java.specification.name
2603 The name of the Runtime Environment specification
2604 (Set to @samp{Java Platform API Specification}).
2605
2606 @item java.class.path
2607 The paths (jar files, zip files and directories) used for finding class files.
2608
2609 @item java.library.path
2610 Directory path used for finding native libraries.
2611
2612 @item java.io.tmpdir
2613 The directory used to put temporary files in.
2614
2615 @item java.compiler
2616 Name of the Just In Time compiler to use by the byte code interpreter.
2617 Currently not used in @code{libgcj}.
2618
2619 @item java.ext.dirs
2620 Directories containing jar files with extra libraries.  Will be used when
2621 resolving classes.
2622
2623 @item java.protocol.handler.pkgs
2624 A @samp{|} separated list of package names that is used to find classes that
2625 implement handlers for @code{java.net.URL}.
2626
2627 @item java.rmi.server.codebase
2628 A list of URLs that is used by the @code{java.rmi.server.RMIClassLoader}
2629 to load classes from.
2630
2631 @item jdbc.drivers
2632 A list of class names that will be loaded by the @code{java.sql.DriverManager}
2633 when it starts up.
2634
2635 @item file.separator
2636 The separator used in when directories are included in a filename
2637 (normally @samp{/} or @samp{\} ).
2638
2639 @item file.encoding
2640 The default character encoding used when converting platform native files to
2641 Unicode (usually set to @samp{8859_1}).
2642
2643 @item path.separator
2644 The standard separator used when a string contains multiple paths
2645 (normally @samp{:} or @samp{;}), the string is usually not a valid character
2646 to use in normal directory names.)
2647
2648 @item line.separator
2649 The default line separator used on the platform (normally @samp{\n}, @samp{\r}
2650 or a combination of those two characters).
2651
2652 @item policy.provider
2653 The class name used for the default policy provider returned by
2654 @code{java.security.Policy.getPolicy}.
2655
2656 @item user.name
2657 The name of the user running the program.  Can be the full name, the login name
2658 or empty if unknown.
2659
2660 @item user.home
2661 The default directory to put user specific files in.
2662
2663 @item user.dir
2664 The current working directory from which the program was started.
2665
2666 @item user.language
2667 The default language as used by the @code{java.util.Locale} class.
2668
2669 @item user.region
2670 The default region as used by the @code{java.util.Local} class.
2671
2672 @item user.variant
2673 The default variant of the language and region local used.
2674
2675 @item user.timezone
2676 The default timezone as used by the @code{java.util.TimeZone} class.
2677
2678 @item os.name
2679 The operating system/kernel name that the program runs on.
2680
2681 @item os.arch
2682 The hardware that we are running on.
2683
2684 @item os.version
2685 The version number of the operating system/kernel.
2686
2687 @item awt.appletWarning
2688 The string to display when an untrusted applet is displayed.
2689 Returned by @code{java.awt.Window.getWarningString()} when the window is
2690 ``insecure''.
2691
2692 @item awt.toolkit
2693 The class name used for initializing the default @code{java.awt.Toolkit}. 
2694 Defaults to @code{gnu.awt.gtk.GtkToolkit}.
2695
2696 @item http.proxyHost
2697 Name of proxy host for http connections.
2698
2699 @item http.proxyPort
2700 Port number to use when a proxy host is in use.
2701
2702 @end table
2703
2704 @node GNU Classpath Properties
2705 @section GNU Classpath Properties
2706
2707 @code{libgcj} is based on the GNU Classpath (Essential Libraries for Java) a
2708 GNU project to create free core class libraries for use with virtual machines
2709 and compilers for the Java language.  The following properties are common to
2710 libraries based on GNU Classpath.
2711
2712 @table @gcctabopt
2713
2714 @item gcj.dumpobject
2715 Enables printing serialization debugging by the @code{java.io.ObjectInput} and
2716 @code{java.io.ObjectOutput} classes when set to something else then the empty
2717 string.  Only used when running a debug build of the library.
2718
2719 @item gnu.classpath.vm.shortname
2720 This is a succinct name of the virtual machine.  For @code{libgcj},
2721 this will always be @samp{libgcj}.
2722
2723 @item gnu.classpath.home.url
2724 A base URL used for finding system property files (e.g.,
2725 @file{classpath.security}).  By default this is a @samp{file:} URL
2726 pointing to the @file{lib} directory under @samp{java.home}.
2727
2728 @end table
2729
2730 @node libgcj Runtime Properties
2731 @section libgcj Runtime Properties
2732
2733 The following properties are specific to the @code{libgcj} runtime and will
2734 normally not be found in other core libraries for the java language.
2735
2736 @table @gcctabopt
2737
2738 @item java.fullversion
2739 The combination of @code{java.vm.name} and @code{java.vm.version}.
2740
2741 @item java.vm.info
2742 Same as @code{java.fullversion}.
2743
2744 @item impl.prefix
2745 Used by the @code{java.net.DatagramSocket} class when set to something else
2746 then the empty string.  When set all newly created @code{DatagramSocket}s will
2747 try to load a class @code{java.net.[impl.prefix]DatagramSocketImpl} instead of
2748 the normal @code{java.net.PlainDatagramSocketImpl}.
2749
2750 @item gnu.gcj.progname
2751 The class or binary name that was used to invoke the program. This will be
2752 the name of the "main" class in the case where the @code{gij} front end is
2753 used, or the program binary name in the case where an application is compiled 
2754 to a native binary.
2755
2756 @item gnu.gcj.runtime.NameFinder.use_addr2line
2757 Whether an external process, @command{addr2line}, should be used to determine
2758 line number information when tracing the stack. Setting this to @code{false} 
2759 may suppress line numbers when printing stack traces and when using
2760 the java.util.logging infrastructure. However, performance may improve
2761 significantly for applications that print stack traces or make logging calls
2762 frequently.
2763
2764 @item gnu.gcj.runtime.VMClassLoader.library_control
2765 This controls how shared libraries are automatically loaded by the
2766 built-in class loader.  If this property is set to @samp{full}, a full
2767 search is done for each requested class.  If this property is set to
2768 @samp{cache} (the default), then any failed lookups are cached and not
2769 tried again.  If this property is set to @samp{never}, then lookups
2770 are never done.  For more information, @xref{Extensions}.
2771
2772 @item gnu.gcj.runtime.endorsed.dirs
2773 This is like the standard @code{java.endorsed.dirs}, property, but
2774 specifies some extra directories which are searched after the standard
2775 endorsed directories.  This is primarily useful for telling
2776 @code{libgcj} about additional libraries which are ordinarily
2777 incorporated into the JDK, and which should be loaded by the bootstrap
2778 class loader, but which are not yet part of @code{libgcj} itself for
2779 some reason.
2780
2781 @item gnu.gcj.jit.compiler
2782 @c FIXME we should probably have a whole node on this...
2783 This is the full path to @command{gcj} executable which should be
2784 used to compile classes just-in-time when
2785 @code{ClassLoader.defineClass} is called.  If not set, @command{gcj}
2786 will not be invoked by the runtime; this can also be controlled via
2787 @code{Compiler.disable}.
2788
2789 @item gnu.gcj.jit.options
2790 This is a space-separated string of options which should be passed to
2791 @command{gcj} when in JIT mode.  If not set, a sensible default is
2792 chosen.
2793
2794 @item gnu.gcj.jit.cachedir
2795 This is the directory where cached shared library files are
2796 stored.  If not set, JIT compilation is disabled.  This should never
2797 be set to a directory that is writable by any other user.
2798
2799 @item gnu.gcj.precompiled.db.path
2800 This is a sequence of file names, each referring to a file created by
2801 @command{gcj-dbtool}.  These files will be used by @code{libgcj} to
2802 find shared libraries corresponding to classes that are loaded from
2803 bytecode.  @code{libgcj} often has a built-in default database; it
2804 can be queried using @code{gcj-dbtool -p}.
2805
2806 @end table
2807
2808
2809 @node Resources
2810 @chapter Resources
2811
2812 While writing @command{gcj} and @code{libgcj} we have, of course, relied
2813 heavily on documentation from Sun Microsystems.  In particular we have
2814 used The Java Language Specification (both first and second editions),
2815 the Java Class Libraries (volumes one and two), and the Java Virtual
2816 Machine Specification.  In addition we've used the online documentation
2817 at @uref{http://java.sun.com/}.
2818
2819 The current @command{gcj} home page is
2820 @uref{http://gcc.gnu.org/java/}.
2821
2822 For more information on gcc, see @uref{http://gcc.gnu.org/}.
2823
2824 Some @code{libgcj} testing is done using the Mauve test suite.  This is
2825 a free software Java class library test suite which is being written
2826 because the JCK is not free.  See
2827 @uref{http://sources.redhat.com/mauve/} for more information.
2828
2829
2830 @node Index
2831 @unnumbered Index
2832
2833 @printindex cp
2834
2835 @bye