OSDN Git Service

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