perlport information about portably embedding string data.
[p5sagit/p5-mst-13.2.git] / jpl / JNI / JNI.pm
CommitLineData
d50cb536 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
35ef589f 190$VERSION = '0.1';
d50cb536 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) {
19956692 201 if ($! =~ /Invalid/) {
d50cb536 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_) {
35ef589f 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
d50cb536 220 $ENV{JAVA_HOME} ||= "/usr/local/java";
221
b83c0eaa 222 my ($arch, @CLASSPATH);
35ef589f 223 if ($^O eq 'MSWin32' and (! $JNI::Config::KAFFE) ) {
d50cb536 224
b83c0eaa 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",
35ef589f 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 '.';
d50cb536 235
b83c0eaa 236 $ENV{CLASSPATH} = join(';', @CLASSPATH);
237 $ENV{THREADS_TYPE} ||= "green_threads";
d50cb536 238
35ef589f 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
b83c0eaa 243 $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB";
d50cb536 244
b83c0eaa 245 push @JVM_ARGS, "classpath", $ENV{CLASSPATH};
35ef589f 246 print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
b83c0eaa 247 $JVM = GetJavaVM("$JAVALIB/javai.dll",@JVM_ARGS);
35ef589f 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);
b83c0eaa 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};
35ef589f 303 print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
b83c0eaa 304 $JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS);
305 }
d50cb536 306}
307
d50cb536 3081;
309__END__
d50cb536 310
311=head1 NAME
312
db4a4bfe 313JNI - Perl encapsulation of the Java Native Interface
d50cb536 314
315=head1 SYNOPSIS
316
317 use JNI;
d50cb536 318
319=head1 DESCRIPTION
320
d50cb536 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
db4a4bfe 334Copyright 1998, O'Reilly & Associates, Inc.
335
336This package may be copied under the same terms as Perl itself.
d50cb536 337
338=head1 SEE ALSO
339
340perl(1).
341
342=cut