X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=jpl%2FJNI%2FJNI.pm;h=6ef65e275a7c69607124391daed4202a9fa2923a;hb=11264fdb092cd4874ac94ff361c9d4e20753485f;hp=b0e87afa3de16e71e9db91684cdce2d94c50cdba;hpb=93e0cdbd0f68fd8d8d75c3510f7893c1ebaa26ae;p=p5sagit%2Fp5-mst-13.2.git diff --git a/jpl/JNI/JNI.pm b/jpl/JNI/JNI.pm index b0e87af..6ef65e2 100644 --- a/jpl/JNI/JNI.pm +++ b/jpl/JNI/JNI.pm @@ -187,7 +187,7 @@ require AutoLoader; GetJavaVM ); -$VERSION = '0.01'; +$VERSION = '0.1'; sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() @@ -213,51 +213,111 @@ sub AUTOLOAD { bootstrap JNI $VERSION; if (not $JPL::_env_) { - $ENV{JAVA_HOME} ||= "/usr/local/java"; - - chop(my $arch = `uname -p`); - chop($arch = `uname -m`) unless -d "$ENV{JAVA_HOME}/lib/$arch"; - - my @CLASSPATH = split(/:/, $ENV{CLASSPATH}); - @CLASSPATH = "." unless @CLASSPATH; - push @CLASSPATH, - "$ENV{JAVA_HOME}/classes", - "$ENV{JAVA_HOME}/lib/classes.zip"; - $ENV{CLASSPATH} = join(':', @CLASSPATH); + # Note that only Kaffe support only cares about what JNI::Config says + use JNI::Config qw($KAFFE $LD_LIBRARY_PATH $CLASS_HOME $LIB_HOME $JAVA_LIB); - $ENV{THREADS_TYPE} ||= "green_threads"; - - $JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}"; - $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB"; + # Win32 and Sun JDK pay attention to $ENV{JAVA_HOME}; Kaffe doesn't + $ENV{JAVA_HOME} ||= "/usr/local/java"; - $JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS); + my ($arch, @CLASSPATH); + if ($^O eq 'MSWin32' and (! $JNI::Config::KAFFE) ) { + + $arch = 'MSWin32' unless -d "$ENV{JAVA_HOME}/lib/$arch"; + @CLASSPATH = split(/;/, $ENV{CLASSPATH}); + @CLASSPATH = "." unless @CLASSPATH; + push @CLASSPATH, + "$ENV{JAVA_HOME}\\classes", + "$ENV{JAVA_HOME}\\lib\\classes.zip", + # MSR - added for JDK 1.3 + "$ENV{JAVA_HOME}\\jre\\lib\\rt.jar", + # MSR - added to find Closer.class + '.'; + + $ENV{CLASSPATH} = join(';', @CLASSPATH); + $ENV{THREADS_TYPE} ||= "green_threads"; + + #$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}"; + # MSR - changed above for JDK 1.3 + $JAVALIB = "$ENV{JAVA_HOME}/lib/"; + + $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB"; + + push @JVM_ARGS, "classpath", $ENV{CLASSPATH}; + print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG; + $JVM = GetJavaVM("$JAVALIB/javai.dll",@JVM_ARGS); + } elsif ($^O eq 'MSWin32' and $JNI::Config::KAFFE) { + croak "Kaffe is not yet supported on MSWin32 platform!"; + } elsif ($JNI::Config::KAFFE) { + # The following code has to build a classpath for us. It would be + # better if we could have *both* a classpath and a classhome, and + # not have to "guess" at the classpath like this. We should be able + # to send in, say, a classpath of ".", and classhome of + # ".../share/kaffe", and have it build the right classpath. That + # doesn't work. The function initClasspath() in findInJar.c in the + # Kaffe source says: "Oh, you have a classpath, well forget + # classhome!" This seems brain-dead to me. But, anyway, that's why + # I don't use the classhome option on GetJavaVM. I have to build + # the classpath by hand. *sigh* + # -- bkuhn + + my $classpath = $ENV{CLASSPATH} || "."; + my %classCheck; + @classCheck{split(/\s*:\s*/, $classpath)} = 1; + foreach my $jarFile (qw(Klasses.jar comm.jar pjava.jar + tools.jar microsoft.jar rmi.jar)) { + $classpath .= ":$JNI::Config::CLASS_HOME/$jarFile" + unless defined $classCheck{"$JNI::Config::CLASS_HOME/$jarFile"}; + # Assume that if someone else already put these here, they knew + # what they were doing and have the order right. + } + $classpath = ".:$classpath" unless defined $classCheck{"."}; + + $ENV{CLASSPATH} = $classpath; # Not needed for GetJavaVM(), since + # we pass it in as a JVM option, but + # something else might expect it. + # (also see comment above) + print STDERR "bkuhn: JNI classpath=$classpath\n"; + unshift(@JVM_ARGS, "classpath", $classpath, + "libraryhome", $JNI::Config::LIB_HOME); + + # The following line is useless; see comment above. + # "classhome", $JNI::Config::CLASS_HOME); + + $JVM = GetJavaVM($JNI::Config::JAVA_LIB, @JVM_ARGS); + } else { + chop($arch = `uname -p`); + chop($arch = `uname -m`) unless -d "$ENV{JAVA_HOME}/lib/$arch"; + + @CLASSPATH = split(/:/, $ENV{CLASSPATH}); + @CLASSPATH = "." unless @CLASSPATH; + push @CLASSPATH, + "$ENV{JAVA_HOME}/classes", + "$ENV{JAVA_HOME}/lib/classes.zip"; + $ENV{CLASSPATH} = join(':', @CLASSPATH); + + $ENV{THREADS_TYPE} ||= "green_threads"; + + $JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}"; + $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB"; + push @JVM_ARGS, "classpath", $ENV{CLASSPATH}; + print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG; + $JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS); + } } -# Preloaded methods go here. - -# Autoload methods go after =cut, and are processed by the autosplit program. - 1; __END__ -# Below is the stub of documentation for your module. You better edit it! =head1 NAME -JNI - Perl extension for blah blah blah +JNI - Perl encapsulation of the Java Native Interface =head1 SYNOPSIS use JNI; - blah blah blah =head1 DESCRIPTION -Stub documentation for JNI was created by h2xs. It looks like the -author of the extension was negligent enough to leave the stub -unedited. - -Blah blah blah. - =head1 Exported constants JNI_ABORT @@ -271,7 +331,9 @@ Blah blah blah. =head1 AUTHOR -A. U. Thor, a.u.thor@a.galaxy.far.far.away +Copyright 1998, O'Reilly & Associates, Inc. + +This package may be copied under the same terms as Perl itself. =head1 SEE ALSO