UCD 5.0.0
[p5sagit/p5-mst-13.2.git] / jpl / docs / Tutorial.pod
CommitLineData
35ef589f 1=head1 NAME
2
3Tutorial - Perl and Java
4
5=head1 SYNOPSIS
6
7Java and Perl have different strengths and complement each other well.
8
9You can connect them at runtime with tools such as JPL, PJC, or
10ActiveX. In theory, you can convert Perl to Java bytecode, and
11vice-versa.
12
13=head2 Note:
14
15Not actually a conversion.
16
17At this stage, we are generating Java opcodes by walking Perl's syntax
18tree. This is very different from converting Perl to Java. It's a lot
19easier!
20
21=head1 1.1 Perl and Java, Compared
22
23Perl offers rich text processing features, high-level network APIs,
24excellent database integration, and a centralized repository of
25reusable code:
26
27=over 4
28
29=item *
30
31Regular expression engine is a powerful sub language that can perform
32complex text manipulations and extract data.
33
34=item *
35
36Packages such as libwww-perl (LWP) and libnet are powerful, high-level
37interfaces to network functionality.
38
39=item *
40
41The Perl DBI is an interface to SQL data sources.
42
43=item *
44
45CPAN provides a centralized, organized archive of reusable code.
46
47=back
48
49Java has a powerful graphical API, has numerous embedded
50implementations, excellent database integration, but no single
51recognized repository of reusable code.
52
53=over 4
54
55=item *
56
57The Swing (JFC) toolkit is a powerful toolkit for developing user
58interfaces. Java also boasts 2D and 3D graphics APIs.
59
60=item *
61
62Java comes in embedded flavors, such as:
63
64=over 4
65
66=item *
67
68Kaffe C<http://www.transvirtual.com/> - embedded implementations for
69different platforms
70
71=item *
72
73Waba C<http://www.wabasoft.com/> - a subset of Java for Windows CE and
74PalmOS
75
76=item *
77
78It's embedded into web browsers (Netscape and MS Internet Explorer)
79
80=item *
81
82and more...
83
84=back
85
86=item *
87
88Java's JDBC is similar to Perl's DBI
89
90=item *
91
92Java has many different repositories of code. Efforts such as the
93Giant Java Tree C<http://www.gjt.org/> attempt to create a unified
94repository.
95
96=back
97
98=head1 1.2 Opportunities to Combine Java and Perl
99
100You have a Java program with a lot of data that needs to be parsed,
101filed, briefed, debriefed, and numbered.
102
103You want to build your GUI in Java, but let Perl do the heavy lifting.
104
105You've adopted the "Java is a systems language, Perl is a scripting
106language" paradigm, and it works for you.
107
108You're not sure which regex implementation to use:
109
110C<org.teeth.green.loony.raving.monster.regex.*;>
111
112C<com.zeppelin.regex.*;>
113
114You want the I<B<best of both worlds>>.
115
116=head1 1.3 Important Differences between Java and Perl
117
118=over 4
119
120=item *
121
122C<perl> compiles and executes programs each time you run them (unless you
123use the Perl compiler).
124
125=item *
126
127C<javac> compiles programs in advance, C<java> runs them in the Java
128interpreter.
129
130=item *
131
132The Java interpreter supports method overloading (methods can have the
133same name, but are differentiated on the basis of their argument
134types). Overloaded methods generally perform the same function, but
135methods with a shorter argument list often use defaults:
136
137=back
138
139 // Draw a circle in the center of the screen
140 int drawCircle(int radius);
141
142 // Draw a circle at specified coordinates
143 int drawCircle(int radius, int h, int k);
144
145=over 4
146
147=item *
148
149The Perl interpreter doesn't support method overloading. In JPL, when
150we call Java from Perl, we need to use some tricks to specify the Java
151method we want to invoke. We'll learn about this when we see JPL's
152C<getmeth> function.
153
154=back
155
156=head2 Note:
157
158At the time this presentation was prepared, JPL did not work with Perl
159for Win32. However, JPL is in the core Perl distribution, and there
160are plans to make it work with Perl for Win32.
161
162With that in mind, I'm presenting the JPL material first, because it
163is of interest to both Win32 and Unix Perl people. The Win32-specific
164stuff (alternatives to JPL) will come last. I won't be offended if the
165Unix people leave when I move to this section of the tutorial, since
166there is no Unix material in that section. I'm perfectly happy to take
167questions between JPL and ActiveX sections.
168
169A subset of JPL now works on Win32. You can embed Java in Perl, but
170you cannot embed Perl in Java (yet).
171
172=head1 2.1 JPL Overview
173
174Let's look at an overview of JPL.
175
176=head2 2.1.1 Calling Perl from Java
177
178Well-supported by JPL, but it is a complicated process:
179
180=over 4
181
182=item *
183
184The JPL preprocessor parses the I<.jpl> file and generates C code
185wrappers for Perl methods. It also generates Java and Perl source
186files.
187
188=item *
189
190The C compiler compiles the wrapper and links it to the
191I<libPerlInterpreter.so> shared library, producing a shared library for
192the wrapper.
193
194=item *
195
196The Java compiler compiles the Java source file, which uses native
197methods to load the wrapper.
198
199=item *
200
201The wrapper connects the Java code to the Perl code in the Perl source
202file.
203
204=back
205
206Fortunately, a generic F<Makefile.PL> simplifies the process. This is a
207Perl script that generates a I<Makefile> for you.
208
209=head2 2.1.2 Calling Java from Perl
210
211This works best when Perl is embedded within a Java program.
212
213The JNI Perl module creates and loads a JVM. There is no precompiler,
214nothing extra -- it's just a Perl module and extension.
215
216 B<A Problem, Though>. In theory, you can call Java from standalone
217 Perl programs, but this doesn't work because some implementations
218 of Java use a user-level threads package (green threads) that
219 override some functions in the C library. Perl is comfortable
220 using these functions, but Java is not happy using the standard C
221 library functions.
222
223So, with green threads, you can't reliably embed Java in a standalone
224Perl program.
225
226Many Java implementations now use native threads. JPL has been tested
227on Solaris with JDK 1.1.x and native threads, but not on Linux.
228
229=head2 Note:
230
231Oddly enough, this is the only way it works on Win32.
232
233On Unix, I've still had trouble, even with native threads. I might
234need to recompile perl with -DREENTRANT, but I'm not sure.
235
236
237=head1 2.2 Working with JPL
238
239How to set up a JPL application, compile, and install it.
240
241=head2 2.2.1 Setting up a Project
242
243=over 4
244
245=item 1
246
247The I<install-jpl> script creates the I<setvars> script. Source the
248output of I<setvars> into your shell when you want to develop or run
249JPL applications.
250
251=item 2
252
253Create a directory with the name of your project, such as
254I<Frotz>. (if you want to use the generic F<Makefile.PL>, you need a
255separate directory for each JPL class you create).
256
257=item 3
258
259Copy the generic F<Makefile.PL> into the project directory. The
260I<jpl/Sample> directory in the Perl distribution includes the generic
261F<Makefile.PL>.
262
263=item 4
264
265Write a I<.jpl> program with the same name as the project (such as
266F<Frotz.jpl>)
267
268=back
269
270=head2 2.2.2 Compiling and Installing a Project
271
272Type C<make> to compile the application, and C<make install> to
273install it. This installs the application in the I<jpl> directory you
274created when you installed JPL.
275
276 B<Beware>. The default I<jpl> directory is the same as the
277 directory you install it I<from>. If you go with the default and
278 delete your Perl source, you'll delete your JPL installation!
279
280Type C<java Frotz> (or the name you chose in step 2 of section 2.2.1)
281to run it
282
283=head2 2.2.3 What's in the jpl Directory?
284
285=over 4
286
287=item *
288
289B<libPerlInterpreter.so>: a shared library that loads the Perl
290interpreter.
291
292=item *
293
294Compiled F<.class> files for JPL applications you have written.
295
296=item *
297
298Native code shared library wrappers for JPL applications you have
299written.
300
301=item *
302
303Perl scripts that contain the Perl code to load at runtime.
304
305=back
306
307 Beware. If you issue the C<make> command and then run the examples
308 in your development directory, you might be in for a surprise! If
309 the JPL directories come first in your CLASSPATH and
310 LD_LIBRARY_PATH, you'll keep running the installed, older version,
311 rather than the one you are developing
312
313=head2 Note:
314
315"Source" means to load it into your current shell, with something
316like:
317
318C<eval-backtick-setvars-backtick>
319
320as opposed to just executing it, because then only the subshell gets
321the environment vars.
322
323=head1 2.3 Calling Perl from Java
324
325Now, we'll look at how you can invoke Perl from Java.
326
327=head2 2.3.1 Perl Methods
328
329You can put Perl methods in your F<.jpl> file. Perl methods are
330declared C<perl> and use double curly braces to make life easier on
331the JPL preprocessor:
332
333 perl int perlMultiply(int a, int b) {{
334 my $result = $a * $b;
335 return $result;
336 }}
337
338In your Java code, you can invoke Perl methods like a Java method. The
339native code wrappers take care of running the Perl code:
340
341 public void invokePerlFunction() {
342 int x = 3;
343 int y = 6;
344 int retval = perlMultiply(x, y);
345 System.out.println(x + " * " + y + " = " + retval);
346 }
347
348class MethodDemo
349
350 class MethodDemo {
351 // A Perl method to multiply two numbers and
352 // return the result.
353 //
354 perl int perlMultiply(int a, int b) {{
355 my $result = $a * $b;
356 return $result;
357 }}
358
359 // A Java method to call the Perl function.
360 //
361 public void invokePerlFunction() {
362 int x = 3;
363 int y = 6;
364 int retval = perlMultiply(x, y);
365 System.out.println(x +" * "+ y +" = "+ retval);
366 }
367
368 public static void main(String[] args) {
369 MethodDemo demo = new MethodDemo();
370 demo.invokePerlFunction();
371 }
372 }
373
374=head2 Where did $self go?
375
376Don't worry, C<$self> is still there. JPL takes care of fetching it, as
377well as all the other arguments:
378
379 perl int perlMultiply(int a, int b) {{
380 my $result = $a * $b;
381 return $result;
382 }}
383
384 perl void calculateProduct() {{
385 my $x = 3;
386 my $y = 6;
387 my $retval = $self->perlMultiply($x, $y);
388 print "$x * $y = $retval\n";
389 }}
390
391 B<Note>. JPL takes care of putting all the arguments, including
392 C<$self>, into variables. If you see a variable in the function
393 header, you will get a variable of the same name without having to
394 use C<shift> or C<@_>, guaranteed.
395
396
397
398NOTE: I've added a line that prints the output of "ref dollar sign self"
399You'll see this when I run the demo.
400
401 class SelfDemo {
402
403 // A Perl method to multiply two values.
404 //
405 perl int perlMultiply(int a, int b) {{
406 my $result = $a * $b;
407 return $result;
408 }}
409
410 // A Perl method to invoke another Perl method.
411 //
412 perl void calculateProduct() {{
413 my $x = 3;
414 my $y = 6;
415 # Ahhh. There's our old friend, $self!
416 #
417 my $retval = $self->perlMultiply($x, $y);
418 # Display the results.
419 #
420 print "$x * $y = $retval\n";
421 }}
422
423 public static void main(String[] args) {
424 SelfDemo demo = new SelfDemo();
425 demo.calculateProduct();
426 }
427 }
428
429=head2 Passing Arrays
430
431If you pass an array from Java into a Perl method, it arrives in the
432form of a scalar reference.
433
434Use the GetIntArrayElements() JNI function to convert that scalar into
435an array of integers.
436
437 perl void min_max( int[] data ) {{
438
439 # Get the array elements
440 #
441 my @new_array = GetIntArrayElements( $data );
442
443 # Sort the array numerically
444 #
445 my @sorted = sort {$a <=> $b} @new_array;
446
447 print "Min: $sorted[0], ",
448 "Max: $sorted[$#sorted]\n";
449 }}
450
451 void minMaxDemo() {
452 int[] data = {101, 99, 42, 666, 23};
453 min_max( data );
454 }
455
456Some JNI Array Functions
457
458=over 4
459
460=item GetBooleanArrayElements( scalar)
461
462Converts scalar to an array of booleans.
463
464=item GetByteArrayElements( scalar )
465
466Converts scalar to an array of bytes.
467
468=item GetCharArrayElements( scalar )
469
470Converts scalar to an array of characters.
471
472=item GetShortArrayElements( scalar )
473
474Converts scalar to an array of short integers.
475
476=item GetIntArrayElements( scalar )
477
478Converts scalar to an array of integers.
479
480=item GetLongArrayElements( scalar )
481
482Converts scalar to an array of long integers.
483
484=item GetFloatArrayElements( scalar )
485
486Converts scalar to an array of floating point numbers.
487
488=item GetDoubleArrayElements( scalar )
489
490Converts scalar to an array of double precision numbers.
491
492=item GetArrayLength( scalar )
493
494Returns the length of the array.
495
496=back
497
498PerlTakesArray.jpl
499 // Show how to pass an array from Java to Perl.
500 //
501
502 public class PerlTakesArray {
503
504 perl void min_max( int[] data ) {{
505 # Get the array elements
506 #
507 my @new_array = GetIntArrayElements( $data );
508
509 # Sort the array numerically
510 #
511 my @sorted = sort {$a <=> $b} @new_array;
512 print "Min: $sorted[0], ",
513 "Max: $sorted[$#sorted]\n";
514 }}
515
516 void minMaxDemo() {
517 // Create an array and ask Perl to tell us
518 // the min and max values.
519 int[] data = {101, 99, 42, 666, 23};
520 min_max( data );
521 }
522
523 public static void main(String[] argv) {
524 PerlTakesArray demo = new PerlTakesArray();
525 demo.minMaxDemo();
526 }
527
528 }
529
530=head2 2.3.4 Passing Arrays of Objects
531
532Working with arrays of objects is a little more complicated, because you
533need to work with them one at a time.
534
535Fetch one element at a time with GetObjectArrayElement(), which returns
536an object of type java.lang.Object (the most generic type).
537
538Explicitly cast the Object to its real type with bless().
539
540 perl void sortArray( String[] names ) {{
541 my @new_array;
542 for (my $i = 0; $i < GetArrayLength($names); $i++) {
543 my $string = GetObjectArrayElement($names, $i);
544 bless $string, "java::lang::String";
545 push @new_array, $string;
546 }
547 print join(', ', sort @new_array), "\n";
548 }}
549
550 void arrayDemo() {
551 String[] names = {"Omega", "Gamma", "Beta", "Alpha"};
552 sortArray( names );
553 }
554
555Note. String is not a primitive type: it is a class (java.lang.String).
556So, you need to use this technique for Strings as well. You can't use
557the technique in 2.3.3.
558
559PerlTakesObjectArray.jpl
560
561 public class PerlTakesObjectArray {
562
563 // Perl method to sort an array of strings.
564 //
565 perl void sortArray( String[] names ) {{
566 my @new_array; # an array to copy names[] to
567
568 # Fetch each element from the array.
569 for (my $i = 0; $i < GetArrayLength($names); $i++) {
570
571 # Get the object (it's not a String yet!) at
572 # the current index ($i).
573 my $string = GetObjectArrayElement($names, $i);
574
575 # Cast (bless) it into a String.
576 bless $string, "java::lang::String";
577
578 # Add it to the array.
579 push @new_array, $string;
580 }
581
582 # Print the sorted, comma-delimited array.
583 print join(', ', sort @new_array), "\n";
584
585 }}
586
587 // Create a String array and ask Perl to sort it for us.
588 //
589
590 void arrayDemo() {
591 String[] names = {"Omega", "Gamma", "Beta", "Alpha"};
592 sortArray( names );
593 }
594
595 public static void main(String[] argv) {
596 PerlTakesObjectArray demo = new PerlTakesObjectArray();
597 demo.arrayDemo();
598 }
599 }
600
601=head2 2.3.5 Returning Arrays from Perl to Java
602
603To write a Perl method that returns an array, declare its return value
604as an array type. Make sure you return a reference to the array, not a
605list:
606
607 perl int[] getTime() {{
608 my ($sec, $min, $hour, @unused) = localtime(time);
609 # Return an array with seconds, minutes, hours
610 my @time_array = ($sec, $min, $hour);
611 return \@time_array;
612 }}
613
614 void testArray() {
615 int time[] = getTime();
616 System.out.println(time[2] + ":" + time[1]);
617 }
618
619PerlGivesArray.jpl
620
621 // Simple JPL demo to show how to send an array to Java
622 // from Perl
623
624 class PerlGivesArray {
625 // Call the Perl method to get an array and print
626 // the hour and minute elements.
627
628 void testArray() {
629 int time[] = getTime();
630 System.out.println(time[2] + ":" + time[1]);
631 }
632
633 // Perl method that returns an array reference.
634 //
635 perl int[] getTime() {{
636 # Get the first three arguments from localtime,
637 # discard the rest.
638 my ($sec, $min, $hour, @unused) = localtime(time);
639
640 # Return an array with seconds, minutes, hours
641 my @time_array = ($sec, $min, $hour);
642 return \@time_array;
643 }}
644
645 public static void main(String[] argv) {
646 PerlGivesArray demo = new PerlGivesArray();
647 demo.testArray();
648 }
649 }
650
651=head2 2.3.6 Arrays from Strings
652
653JPL will slice Perl strings up into Java arrays for you. If you declare
654a Perl method as an array type and return a string (instead of an array
655reference), JPL splits up the elements into an array.
656
657Consider this example, where a GIF stored in a string gets turned into
658an array of bytes so Java can make an Image out of it:
659
660 void generateImage() {
661 Toolkit kit = Toolkit.getDefaultToolkit();
662 byte[] image_data = mkImage();
663 img = kit.createImage( image_data );
664 }
665
666 perl byte[] mkImage() {{
667 use GD;
668 my $im = new GD::Image( $self->width, $self->height);
669 my $white = $im->colorAllocate(255, 255, 255);
670 my $blue = $im->colorAllocate(0, 0, 255);
671 $im->fill($white, 0, 0);
672 $im->string(gdLargeFont, 10, 10, "Hello, World", $blue);
673 return $im->gif;
674 }}
675
676GifDemo.jpl
677
678 import java.awt.*;
679 import java.awt.event.*;
680 import java.awt.image.*;
681
682 /*
683 * A JPL program that demonstrates passing byte arrays
684 * between Java and Perl
685 *
686 */
687
688 class GIFDemo extends Canvas {
689 Image img;
690 int width = 200;
691 int height = 30;
692
693 // Constructor for this class.
694 public GIFDemo() {
695 this.setSize(width, height);
696 }
697
698 // Java method to create an image.
699 //
700 void generateImage() {
701 Toolkit kit = Toolkit.getDefaultToolkit();
702
703 // Invoke the mkImage() Perl method to generate an
704 // image.
705
706 byte[] image_data = mkImage();
707
708 // Create the image with the byte array we got
709 // from the Perl method.
710
711 img = kit.createImage( image_data );
712 }
713
714 // A Perl method to generate an image.
715
716 perl byte[] mkImage() {{
717
718 # Use the GD image manipulation extension.
719
720 use GD;
721
722 # Create a new image with the height and width specified
723 # in the enclosing Java class.
724
725 my $im = new GD::Image( $self->width, $self->height);
726
727 # Allocate two colors.
728
729 my $white = $im->colorAllocate(255, 255, 255);
730 my $blue = $im->colorAllocate(0, 0, 255);
731
732 # Fill the image with white and draw a greeting.
733
734 $im->fill($white, 0, 0);
735 $im->string(gdLargeFont, 10, 10,
736 "Hello, World", $blue);
737 return $im->gif;
738 }}
739
740 // Java uses this to repaint the image when necessary.
741
742 public void paint(Graphics g) {
743 g.drawImage(img, 0, 0, this);
744 }
745
746 // The entry point.
747
748 public static void main(String[] argv) {
749
750 // Set up a frame and create an image.
751
752 Frame f = new Frame("GD Example");
753 f.setLayout(new BorderLayout());
754
755 GIFDemo demo = new GIFDemo();
756 demo.generateImage();
757
758 f.add("Center", demo);
759 f.addWindowListener( new Handler() );
760
761 f.pack();
762 f.show();
763
764 }
765 }
766
767 // A handler to process a request to close a window.
768
769 class Handler extends WindowAdapter {
770 public void windowClosing(WindowEvent e) {
771 System.exit(0);
772 }
773 }
774
775=head2 2.3.7 Summary: Calling Perl from Java
776
777=over 4
778
779=item 1
780
781Put your embedded Perl code in methods that are declared C<perl>.
782
783=item 2
784
785Use double, rather than single, curly braces ({{ and }}).
786
787=item 3
788
789Invoke the Perl methods from Java just like any other Java method.
790
791=item 4
792
793No need to pull arguments off of C<@_> with C<shift>: JPL takes care of
794this for you. This includes C<$self>.
795
796=item 5
797
798If you pass a Java array into a Perl method, it comes in as a scalar
799reference.
800
801=item 6
802
803Convert references to arrays of primitives with C<Get*ArrayElements>
804
805=item 7
806
807Use C<GetObjectArrayElement> to get elements from arrays of strings and
808other objects.
809
810=item 8
811
812To return an array from a C<perl> method, declare the method as returning
813an array type, and either:
814
815=item 9
816
817Return an array reference.
818
819=item 10
820
821Return a string: JPL slices it up for you.
822
823=back
824
825=head1 2.4 Calling Java from Perl
826
827Next, let's look at how to invoke Java from Perl.
828
829=head2 2.4.1 Java in Perl in Java
830
831Remember the issues from 2.1.2 - this is unstable unless you are calling Java from Perl methods that are themselves embedded in a Java program.
832
833=head2 2.4.2 Java in Perl: Simple Constructors
834
835Use JPL::Class to load the class:
836
837C<use JPL::Class "java::awt::Frame";>
838
839Invoke the constructor to create an instance of the class:
840
841C<my $f = java::awt::Frame->new;>
842
843You've got a reference to a Java object in $f, a Perl scalar. I think
844this is cool.
845
846=head2 2.4.3 Constructors that Take Parameters
847
848If the constructor has parameters, look up the method signature with
849C<getmeth>:
850
851my $new = getmeth("new", ['java.lang.String'], []);
852
853The first argument to C<getmeth> is the name of the method. The second
854argument is a reference to an array that contains a list of the argument
855types. The final argument to C<getmeth> is a reference to an array
856containing a single element with the return type. Constructors always
857have a null (void) return type, even though they return an instance of
858an object.
859
860Invoke the method through the variable you created:
861
862my $f = java::awt::Frame->$new( "Frame Demo" );
863
864Because Java supports method overloading, the only way Java can
865distinguish between different methods that have the same name is through
866the method signature. The C<getmeth> function simply returns a mangled,
867Perl-friendly version of the signature. JPL's AutoLoader takes care of
868finding the right class.
869
870For example, the method signature for $new is C<(Ljava/lang/String;)V>.
871In Perl, this is translated to C<new__Ljava_lang_String_2__V>. Sure, it
872means something to Java, but thanks to C<getmeth> and JPL's AutoLoader,
873we don't have to worry about it!
874
875=head2 2.4.4 More on getmeth
876
877The C<getmeth> function is not just for constructors. You'll use it to look
878up method signatures for any method that takes arguments.
879
880To use C<getmeth>, just supply the Java names of the types and objects in
881the argument or return value list. Here are a few examples:
882
883=over 4
884
885=item *
886
887Two int arguments, void return type:
888
889 $setSize = getmeth("setSize", ['int', 'int'], []);
890
891=item *
892
893One argument (java.awt.Component), with a return type of the same:
894
895 $add = getmeth("add", ['java.awt.Component'],
896
897 ['java.awt.Component']);
898
899=item *
900
901Two arguments, a String object and a boolean value, and a void return
902type:
903
904 $new = getmeth("new",
905
906 ['java.lang.String', 'boolean'], []);
907
908=item *
909
910A String argument with a java.lang.Class return type:
911
912 $forName = getmeth("forName",
913
914 ['java.lang.String'],
915
916 ['java.lang.Class']);
917
918=item *
919
920No arguments, but a boolean return value:
921
922 $next = getmeth("next", [], ['boolean']);
923
924=back
925
926=head2 2.4.5 Instance Variables
927
928Java instance variables that belong to a class can be reached through
929$self and a method with the same name as the instance variables:
930
931 $frame->$setSize( $self->width, $self->height );
932
933Here is an example:
934
935 class VarDemo {
936
937 int foo = 100;
938
939 perl int perlChange() {{
940 my $current_value = $self->foo;
941
942 # Change foo to ten times itself.
943
944 $self->foo( $current_value * 10 );
945
946 }}
947
948 void executeChange() {
949
950 perlChange();
951 System.out.println(foo);
952
953 }
954
955 public static void main(String[] args) {
956
957 VarDemo demo = new VarDemo();
958 demo.executeChange();
959
960 }
961
962 }
963
964Note. JPL creates these methods with the same name as the variable. You
965can also supply a value to set the variable's value. If you create a
966method with this name, it will collide with the one that JPL defines.
967
968FrameDemo.jpl
969
970 /*
971 * FrameDemo - create and show a Frame in Perl.
972 *
973 */
974
975 public class FrameDemo {
976
977 int height = 50;
978 int width = 200;
979 perl void make_frame () {{
980
981 # Import two Java classes.
982
983 use JPL::Class "java::awt::Frame";
984 use JPL::Class "java::awt::Button";
985
986 # Create a Frame and a Button. The two calls to new()
987 # have the same signature.
988
989 my $new = getmeth("new", ['java.lang.String'], []);
990 my $frame = java::awt::Frame->$new( "Frame Demo" );
991 my $btn = java::awt::Button->$new( "Do Not Press Me" );
992
993 # Add the button to the frame.
994
995 my $add = getmeth("add", ['java.awt.Component'],
996 ['java.awt.Component']);
997 $frame->$add( $btn );
998
999 # Set the size of the frame and show it.
1000
1001 my $setSize = getmeth("setSize", ['int', 'int'], []);
1002 $frame->$setSize($self->width, $self->height);
1003 $frame->show;
1004
1005 }}
1006
1007 public static void main(String[] argv) {
1008
1009 FrameDemo demo = new FrameDemo();
1010 demo.make_frame();
1011
1012 }
1013
1014 }
1015
1016=head2 2.4.6 Summary: Calling Java from Perl
1017
1018=over 4
1019
1020=item 1
1021
1022Use JPL::Class to specify a Java class to import.
1023
1024=item 2
1025
1026You can directly invoke constructors and methods that take no arguments.
1027
1028=item 3
1029
1030If the constructor or method takes arguments, use getmeth to look up its
1031signature.
1032
1033=item 4
1034
1035Use $self to access Java instance variables and methods.
1036
1037=back
1038
1039=head1 COPYRIGHT
1040
1041Copyright (c) 1999, Brian Jepson
1042
1043You may distribute this file under the same terms as Perl itself.
1044
1045Converted from FrameMaker by Kevin Falcone.
1046
1047=cut