The latest JPL from the anoncvs.
[p5sagit/p5-mst-13.2.git] / jpl / JNI / JNI.pm
1 package JNI;
2
3 use strict;
4 use Carp;
5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD $JVM @JVM_ARGS $JAVALIB);
6
7 require Exporter;
8 require DynaLoader;
9 require 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.1';
191
192 sub 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
213 bootstrap JNI $VERSION;
214
215 if (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
308 1;
309 __END__
310
311 =head1 NAME
312
313 JNI - 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
334 Copyright 1998, O'Reilly & Associates, Inc.
335
336 This package may be copied under the same terms as Perl itself.
337
338 =head1 SEE ALSO
339
340 perl(1).
341
342 =cut