OSDN Git Service

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