The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
JNI (JAVA NATIVE INTERFACE) EXTENSION
-------------------------------------
Inline::Java now provides a JNI extension that allows you to load the Java 
virtual machine as shared object instead of running it as a separate process. 


PLATFORM AVAILABILITY
---------------------
The JNI extension is available on all supported platforms.

The extension builds properly on all platform, but problems can occur when
running it or tweaking maybe necessary on certain platforms. All help
is welcome if anyone out there is a JNI expert.

The reason why JNI is a bit complex under Linux/Solaris is because of 
threads. The Java Virtual Machine (libjvm.so) shared object uses native 
threads when embedded inside another program and that host program (in
this case Perl) must link with the same threads library for everything 
to work properly. Starting with Perl 5.8, this works fine. With previous
versions, you may get around rebuilding Perl by setting LD_PRELOAD. 
The only problems encountered where that when setting LD_PRELOAD before 
running the test suite, the LD_PRELOAD affects make as well and on Solaris 
some crashes were seen. Read more on this in the Solaris section below.

Note: Make sure the directories listed at the end of the installation
procedure are included in your LD_LIBRARY_PATH (PATH on Win32) environment
variable. This JNI extension will not load properly the the Java shared 
objects cannot be located at runtime.


OVERVIEW
--------
              +----------+------------+------------+
              | JDK1.3.1 | J2SDK1.4.2 | J2SDK1.5.0 |
+-------------+----------+------------+------------+
| Win32       |    ok    |     ok     |     ok     |
+-------------+----------+------------+------------+
| cygwin      |    ok*   |     ok*    |     ok*    |
+-------------+----------+------------+------------+
| Linux RH7.3 |    ok*   |     ok*    |     ?      |
+-------------+----------+------------+------------+
| Linux RH9.0 |    ok*   |     ok*    |     ok     |
+-------------+----------+------------+------------+
| Soloris 2.8 |    ok*   |      ?     |     ?      |
+-------------+----------+------------+------------+
*   : Read below


WIN32
-----
Java 2 SDK 1.3.1:
	The JNI extension runs without problems.

Java 2 SDK 1.4.2:
	The JNI extension runs without problems.


LINUX
-----
Java 2 SDK 1.3.1:
    The JNI extension runs without problems with this Java 2 SDK, provided
that you use Perl >= 5.8.0 or do one of the following:

1- Rebuild perl and add the libpthread library in front of all other 
   libraries (see the 'BUILDING PERL' section below). You should also 
   use your system's malloc (not perl's).
   This is the recommended solution.

2- Add the proper version of libpthread.so to your LD_PRELOAD environment 
   variable. On my test system this was /lib/i686/libpthread.so.0.
   This solution seems viable but thread related crashes/hang-ups have
   been reported on some systems. If make crashes while running the test 
   suite, try running it like this:
     % for i in `ls t/*.t` ; do perl -Mblib $i; done

Also, make sure you use do not use 'classic' VM. This one should only
be used with 'green threads', which don't seem to work with JNI. Use either 
the 'client' or the 'server' VMs.

Java 2 SDK 1.4.2:
    The same as Java 2 SDK 1.3.1 applies.

	
SOLARIS
-------
Java 2 SDK 1.3.1:
    The JNI extension runs without problems with this Java 2 SDK, provided
that you use Perl >= 5.8.0 or do one of the following:

1- Rebuild perl and add the libthread library in front of all other 
   libraries (see the 'BUILDING PERL' section below). You should also 
   use gcc and your system's malloc (not perl's).
   This is the recommended solution.

2- Add the proper version of libthread.so to your LD_PRELOAD environment 
   variable. On my test system this was /lib/libthread.so.
   This solution seems viable but thread related crashes/hang-ups have
   been reported on some systems. If make crashes while running the test 
   suite, try running it like this:
     % for i in `ls t/*.t` ; do perl -Mblib $i; done


CYGWIN
------
Java 2 SDK 1.3.1:
   The JNI extension runs without problems.

    PerlInterpreter:
        Compiles but stand-alone (non-JNI initiated) Java interpreter locks
        up when attempting to load the DLL.  This is a known issue with
        initialization of the cygwin1.dll from a non-cygwin DLL or EXE, which
        has been "broken" since at least Cygwin 1.5.13.
        A possible work around might be to build the PerlInterpreter against
        a native Win32 Perl distribution with '-mno-cygwin' GCC compile flag,
        although this means you would be using native Perl instead of Cygwin
        Perl when using PerlInterpreter.

Java 2 SDK 1.4.2:
   The JNI extension runs without problems.

   PerlInterpreter:
       The same as Java 2 SDK 1.3.1 applies.

   PerlNatives:
       Compiles and runs fine in a JNI-initiated interpreter, but stand-alone
       (non-JNI initiated) Java interpreter locks up when attempting to load
       the DLL.  This is a known issue with initialization of the
       cygwin1.dll from a non-cygwin DLL or EXE, which has been "broken"
       since at least Cygwin 1.5.13.

Java 2 SDK 1.5.0:
   The same as Java 2 SDK 1.4.2 applies.


BUILDING PERL
-------------
Here's how to rebuild Perl (version < 5.8.0) to get the JNI extension to 
work properly:

- Use all the defaults or whatever makes sense, but no threaded Perl 
  and no interpreter threads, i.e.:

  Build a threading Perl? [n] n 
  Build Perl for multiplicity? [n] n 

- When asked what libraries to use, type -lthread (Solaris) or -lpthread 
  (Linux) and tack on whatever the default is at the end, i.e.:

  What libraries to use? -> [-lnsl -lndbm -lgdbm -ldb -ldl -lm -lc -lcrypt 
  -lutil] -lpthread -lnsl -lndbm -lgdbm -ldb -ldl -lm -lc -lcrypt -lutil 
  (under Linux it's -lpthread, but for Solaris it's -lthread) 

- Make sure that you do not use perl's own malloc, i.e.: 

  Do you wish to attempt to use the malloc that comes with perl5? -> [n] n 


RUNNING Inline::Java WITH THE JNI EXTENSION
-------------------------------------------
To run Inline::Java with the JNI extension, do one of the following:

   - set the JNI configuration option to 1
   - set the PERL_INLINE_JAVA_JNI environment variable to 1

To run the test suite (make test) with the JNI extension you must use the 
PERL_INLINE_JAVA_JNI environment variable


USING THE 'SHARED_JVM' MODE
---------------------------
Inline::Java 0.30 introduced a 'SHARED_JVM' mode that allows many clients 
to connect to the same Inline::Java Java server. The 'SHARED_JVM' mode is 
meant to be used with forking processes such as Apache with mod_perl. The 
'SHARED_JVM' mode does NOT work along with the JNI mode. In fact the author 
was not able to successfully fork the Java Virtual Machine under any 
circumstances.