gcj.texi (Invocation): Update JvAttachCurrentThread documentation.

* gcj.texi (Invocation): Update JvAttachCurrentThread documentation.
	Add note about handling uncaught exceptions. Add an exception handler
	to example.

From-SVN: r52022
This commit is contained in:
Bryce McKinlay 2002-04-08 12:03:02 +00:00 committed by Bryce McKinlay
parent fc06c4b207
commit 00b224f8b1
2 changed files with 49 additions and 9 deletions

View File

@ -1,3 +1,9 @@
2002-04-08 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* gcj.texi (Invocation): Update JvAttachCurrentThread documentation.
Add note about handling uncaught exceptions. Add an exception handler
to example.
2002-04-08 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* parse.y (resolve_qualified_expression_name): Clear "from_super" flag

View File

@ -1709,13 +1709,16 @@ used in a future release.
@deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group})
Registers an existing thread with the Java runtime. This must be called once
by a multi-threaded C++ application for each thread, before that thread makes
any other Java or CNI calls.
from each thread, before that thread makes any other Java or CNI calls. It
must be called after @code{JvCreateJavaVM}.
@var{name} specifies a name for the thread. It may be @code{NULL}, in which
case a name will be generated.
@var{group} is the ThreadGroup in which this thread will be a member. If it
is @code{NULL}, the thread will be a member of the main thread group.
The return value is the Java @code{Thread} object that represents the thread.
It is safe to call @code{JvAttachCurrentThread()} more than once from the same
thread. If the thread is already attached, the call is ignored and the current
thread object is returned.
@end deftypefun
@deftypefun jint JvDetachCurrentThread ()
@ -1723,26 +1726,57 @@ Unregisters a thread from the Java runtime. This should be called by threads
that were attached using @code{JvAttachCurrentThread()}, after they have
finished making calls to Java code. This ensures that any resources associated
with the thread become eligible for garbage collection.
This function returns @code{0} upon success.
This function returns @code{0} upon success, or @code{-1} if the current thread
is not attached.
@end deftypefun
The following example demonstrates the use of @code{JvCreateJavaVM()} from
a simple C++ application. It can be compiled with
@command{c++ test.cc -lgcj}.
@subsection Handling uncaught exceptions
If an exception is thrown from Java code called using the invocation API, and
no handler for the exception can be found, the runtime will abort the
application. In order to make the application more robust, it is recommended
that code which uses the invocation API be wrapped by a top-level try/catch
block that catches all Java exceptions.
@subsection Example
The following code demonstrates the use of the invocation API. In this
example, the C++ application initializes the Java runtime and attaches
itself. The @code{java.lang.System} class is initialized in order to
access its @code{out} field, and a Java string is printed. Finally, the thread
is detached from the runtime once it has finished making Java calls. Everything
is wrapped with a try/catch block to provide a default handler for any uncaught
exceptions.
The example can be compiled with @command{c++ test.cc -lgcj}.
@example
// test.cc
#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>
int main(int argc, char *argv)
@{
using namespace java::lang;
JvCreateJavaVM(NULL);
String *hello = JvNewStringLatin1("Hello from C++");
System::out->println(hello);
try
@{
JvCreateJavaVM(NULL);
JvAttachCurrentThread(NULL, NULL);
String *message = JvNewStringLatin1("Hello from C++");
JvInitClass(&System.class$);
System::out->println(message);
JvDetachCurrentThread();
@}
catch (Throwable *t)
@{
System::err->println(JvNewStringLatin1("Unhandled Java exception:"));
t->printStackTrace();
@}
@}
@end example