1package JNI; 2 3use strict; 4use Carp; 5use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD $JVM @JVM_ARGS $JAVALIB); 6 7require Exporter; 8require DynaLoader; 9require AutoLoader; 10 11@ISA = qw(Exporter DynaLoader); 12 13@EXPORT = qw( 14 JNI_ABORT 15 JNI_COMMIT 16 JNI_ERR 17 JNI_FALSE 18 JNI_H 19 JNI_OK 20 JNI_TRUE 21 GetVersion 22 DefineClass 23 FindClass 24 GetSuperclass 25 IsAssignableFrom 26 Throw 27 ThrowNew 28 ExceptionOccurred 29 ExceptionDescribe 30 ExceptionClear 31 FatalError 32 NewGlobalRef 33 DeleteGlobalRef 34 DeleteLocalRef 35 IsSameObject 36 AllocObject 37 NewObject 38 NewObjectA 39 GetObjectClass 40 IsInstanceOf 41 GetMethodID 42 CallObjectMethod 43 CallObjectMethodA 44 CallBooleanMethod 45 CallBooleanMethodA 46 CallByteMethod 47 CallByteMethodA 48 CallCharMethod 49 CallCharMethodA 50 CallShortMethod 51 CallShortMethodA 52 CallIntMethod 53 CallIntMethodA 54 CallLongMethod 55 CallLongMethodA 56 CallFloatMethod 57 CallFloatMethodA 58 CallDoubleMethod 59 CallDoubleMethodA 60 CallVoidMethod 61 CallVoidMethodA 62 CallNonvirtualObjectMethod 63 CallNonvirtualObjectMethodA 64 CallNonvirtualBooleanMethod 65 CallNonvirtualBooleanMethodA 66 CallNonvirtualByteMethod 67 CallNonvirtualByteMethodA 68 CallNonvirtualCharMethod 69 CallNonvirtualCharMethodA 70 CallNonvirtualShortMethod 71 CallNonvirtualShortMethodA 72 CallNonvirtualIntMethod 73 CallNonvirtualIntMethodA 74 CallNonvirtualLongMethod 75 CallNonvirtualLongMethodA 76 CallNonvirtualFloatMethod 77 CallNonvirtualFloatMethodA 78 CallNonvirtualDoubleMethod 79 CallNonvirtualDoubleMethodA 80 CallNonvirtualVoidMethod 81 CallNonvirtualVoidMethodA 82 GetFieldID 83 GetObjectField 84 GetBooleanField 85 GetByteField 86 GetCharField 87 GetShortField 88 GetIntField 89 GetLongField 90 GetFloatField 91 GetDoubleField 92 SetObjectField 93 SetBooleanField 94 SetByteField 95 SetCharField 96 SetShortField 97 SetIntField 98 SetLongField 99 SetFloatField 100 SetDoubleField 101 GetStaticMethodID 102 CallStaticObjectMethod 103 CallStaticObjectMethodA 104 CallStaticBooleanMethod 105 CallStaticBooleanMethodA 106 CallStaticByteMethod 107 CallStaticByteMethodA 108 CallStaticCharMethod 109 CallStaticCharMethodA 110 CallStaticShortMethod 111 CallStaticShortMethodA 112 CallStaticIntMethod 113 CallStaticIntMethodA 114 CallStaticLongMethod 115 CallStaticLongMethodA 116 CallStaticFloatMethod 117 CallStaticFloatMethodA 118 CallStaticDoubleMethod 119 CallStaticDoubleMethodA 120 CallStaticVoidMethod 121 CallStaticVoidMethodA 122 GetStaticFieldID 123 GetStaticObjectField 124 GetStaticBooleanField 125 GetStaticByteField 126 GetStaticCharField 127 GetStaticShortField 128 GetStaticIntField 129 GetStaticLongField 130 GetStaticFloatField 131 GetStaticDoubleField 132 SetStaticObjectField 133 SetStaticBooleanField 134 SetStaticByteField 135 SetStaticCharField 136 SetStaticShortField 137 SetStaticIntField 138 SetStaticLongField 139 SetStaticFloatField 140 SetStaticDoubleField 141 NewString 142 GetStringLength 143 GetStringChars 144 NewStringUTF 145 GetStringUTFLength 146 GetStringUTFChars 147 GetArrayLength 148 NewObjectArray 149 GetObjectArrayElement 150 SetObjectArrayElement 151 NewBooleanArray 152 NewByteArray 153 NewCharArray 154 NewShortArray 155 NewIntArray 156 NewLongArray 157 NewFloatArray 158 NewDoubleArray 159 GetBooleanArrayElements 160 GetByteArrayElements 161 GetCharArrayElements 162 GetShortArrayElements 163 GetIntArrayElements 164 GetLongArrayElements 165 GetFloatArrayElements 166 GetDoubleArrayElements 167 GetBooleanArrayRegion 168 GetByteArrayRegion 169 GetCharArrayRegion 170 GetShortArrayRegion 171 GetIntArrayRegion 172 GetLongArrayRegion 173 GetFloatArrayRegion 174 GetDoubleArrayRegion 175 SetBooleanArrayRegion 176 SetByteArrayRegion 177 SetCharArrayRegion 178 SetShortArrayRegion 179 SetIntArrayRegion 180 SetLongArrayRegion 181 SetFloatArrayRegion 182 SetDoubleArrayRegion 183 RegisterNatives 184 UnregisterNatives 185 MonitorEnter 186 MonitorExit 187 GetJavaVM 188); 189 190$VERSION = '0.2'; 191 192sub AUTOLOAD { 193 # This AUTOLOAD is used to 'autoload' constants from the constant() 194 # XS function. If a constant is not found then control is passed 195 # to the AUTOLOAD in AutoLoader. 196 197 my $constname; 198 ($constname = $AUTOLOAD) =~ s/.*:://; 199 my $val = constant($constname, @_ ? $_[0] : 0); 200 if ($! != 0) { 201 if ($! =~ /Invalid/) { 202 $AutoLoader::AUTOLOAD = $AUTOLOAD; 203 goto &AutoLoader::AUTOLOAD; 204 } 205 else { 206 croak "Your vendor has not defined JNI macro $constname"; 207 } 208 } 209 eval "sub $AUTOLOAD { $val }"; 210 goto &$AUTOLOAD; 211} 212 213bootstrap JNI $VERSION; 214 215if (not $JPL::_env_) { 216 # Note that only Kaffe support only cares about what JNI::Config says 217 use JNI::Config qw($KAFFE $LD_LIBRARY_PATH $CLASS_HOME $LIB_HOME $JAVA_LIB); 218 219 # Win32 and Sun JDK pay attention to $ENV{JAVA_HOME}; Kaffe doesn't 220 $ENV{JAVA_HOME} ||= "/usr/local/java"; 221 222 my ($arch, @CLASSPATH); 223 if ($^O eq 'MSWin32' and (! $JNI::Config::KAFFE) ) { 224 225 $arch = 'MSWin32' unless -d "$ENV{JAVA_HOME}/lib/$arch"; 226 @CLASSPATH = split(/;/, $ENV{CLASSPATH}); 227 @CLASSPATH = "." unless @CLASSPATH; 228 push @CLASSPATH, 229 "$ENV{JAVA_HOME}\\classes", 230 "$ENV{JAVA_HOME}\\lib\\classes.zip", 231 # MSR - added for JDK 1.3 232 "$ENV{JAVA_HOME}\\jre\\lib\\rt.jar", 233 # MSR - added to find Closer.class 234 '.'; 235 236 $ENV{CLASSPATH} = join(';', @CLASSPATH); 237 $ENV{THREADS_TYPE} ||= "green_threads"; 238 239 #$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}"; 240 # MSR - changed above for JDK 1.3 241 $JAVALIB = "$ENV{JAVA_HOME}/lib/"; 242 243 $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB"; 244 245 push @JVM_ARGS, "classpath", $ENV{CLASSPATH}; 246 print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG; 247 $JVM = GetJavaVM("$JAVALIB/javai.dll",@JVM_ARGS); 248 } elsif ($^O eq 'MSWin32' and $JNI::Config::KAFFE) { 249 croak "Kaffe is not yet supported on MSWin32 platform!"; 250 } elsif ($JNI::Config::KAFFE) { 251 # The following code has to build a classpath for us. It would be 252 # better if we could have *both* a classpath and a classhome, and 253 # not have to "guess" at the classpath like this. We should be able 254 # to send in, say, a classpath of ".", and classhome of 255 # ".../share/kaffe", and have it build the right classpath. That 256 # doesn't work. The function initClasspath() in findInJar.c in the 257 # Kaffe source says: "Oh, you have a classpath, well forget 258 # classhome!" This seems brain-dead to me. But, anyway, that's why 259 # I don't use the classhome option on GetJavaVM. I have to build 260 # the classpath by hand. *sigh* 261 # -- bkuhn 262 263 my $classpath = $ENV{CLASSPATH} || "."; 264 my %classCheck; 265 @classCheck{split(/\s*:\s*/, $classpath)} = 1; 266 foreach my $jarFile (qw(Klasses.jar comm.jar pjava.jar 267 tools.jar microsoft.jar rmi.jar)) { 268 $classpath .= ":$JNI::Config::CLASS_HOME/$jarFile" 269 unless defined $classCheck{"$JNI::Config::CLASS_HOME/$jarFile"}; 270 # Assume that if someone else already put these here, they knew 271 # what they were doing and have the order right. 272 } 273 $classpath = ".:$classpath" unless defined $classCheck{"."}; 274 275 $ENV{CLASSPATH} = $classpath; # Not needed for GetJavaVM(), since 276 # we pass it in as a JVM option, but 277 # something else might expect it. 278 # (also see comment above) 279 print STDERR "bkuhn: JNI classpath=$classpath\n"; 280 unshift(@JVM_ARGS, "classpath", $classpath, 281 "libraryhome", $JNI::Config::LIB_HOME); 282 283 # The following line is useless; see comment above. 284 # "classhome", $JNI::Config::CLASS_HOME); 285 286 $JVM = GetJavaVM($JNI::Config::JAVA_LIB, @JVM_ARGS); 287 } else { 288 chop($arch = `uname -p`); 289 chop($arch = `uname -m`) unless -d "$ENV{JAVA_HOME}/lib/$arch"; 290 291 @CLASSPATH = split(/:/, $ENV{CLASSPATH}); 292 @CLASSPATH = "." unless @CLASSPATH; 293 push @CLASSPATH, 294 "$ENV{JAVA_HOME}/classes", 295 "$ENV{JAVA_HOME}/lib/classes.zip"; 296 $ENV{CLASSPATH} = join(':', @CLASSPATH); 297 298 $ENV{THREADS_TYPE} ||= "green_threads"; 299 300 $JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}"; 301 $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB"; 302 push @JVM_ARGS, "classpath", $ENV{CLASSPATH}; 303 print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG; 304 $JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS); 305 } 306} 307 3081; 309__END__ 310 311=head1 NAME 312 313JNI - Perl encapsulation of the Java Native Interface 314 315=head1 SYNOPSIS 316 317 use JNI; 318 319=head1 DESCRIPTION 320 321=head1 Exported constants 322 323 JNI_ABORT 324 JNI_COMMIT 325 JNI_ERR 326 JNI_FALSE 327 JNI_H 328 JNI_OK 329 JNI_TRUE 330 331 332=head1 AUTHOR 333 334Copyright 1998, O'Reilly & Associates, Inc. 335 336This package may be copied under the same terms as Perl itself. 337 338=head1 SEE ALSO 339 340perl(1). 341 342=cut 343