To call a COBOL program from a Java(TM) program, perform the following steps:
This section describes how to code a COBOL program that is called by a Java program. The guidelines are illustrated in two sample COBOL programs. A later section shows two Java programs that interact with these COBOL programs.
If your COBOL program will be called by a Java program:
PROCESS NOMONOPRC NOSTDTRUNC OPTIONS THREAD (SERIALIZE). 1 *** COBOL native program called from Java *** static method IDENTIFICATION DIVISION. PROGRAM-ID. "Java_Hello_displayHello". 2 Author. INSTALLATION. IBM Toronto Lab. DATE-WRITTEN. DATE-COMPILED. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-ISERIES OBJECT-COMPUTER. IBM-ISERIES INPUT-OUTPUT SECTION. FILE-CONTROL. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 IS-COPY PIC 1. 01 NAME-PTR USAGE POINTER. 01 NAME-LENGTH PIC 9(4) BINARY. 01 I PIC 9(4) BINARY. 01 NAME-X. 05 CHAR-X OCCURS 20 TIMES PIC X. LINKAGE SECTION. *** JNI interface function table COPY JNI. 3 01 NAME. 05 CHAR OCCURS 20 TIMES PIC N USAGE NATIONAL. 01 ENV-PTR USAGE POINTER. 01 CLASS-REF PIC S9(9) BINARY. 01 TITLE-CODE PIC S9(9) BINARY. 01 NAME-REF PIC S9(9) BINARY. 01 INTERFACE-PTR USAGE POINTER.
PROCEDURE DIVISION USING BY VALUE ENV-PTR 4a CLASS-REF 4b TITLE-CODE 4c NAME-REF. 4c MAIN-LINE SECTION. MAIN-PROGRAM-LOGIC. SET ADDRESS OF INTERFACE-PTR TO ENV-PTR. SET ADDRESS OF JNI-NATIVE-INTERFACE TO INTERFACE-PTR. *** Callback JNI interface function GET-STRING-LENGTH to *** retrieve the name length CALL GET-STRING-LENGTH USING BY VALUE ENV-PTR 4 NAME-REF RETURNING INTO NAME-LENGTH. *** Callback JNI interface function GET-STRING-CHARS to *** retrieve the name characters CALL GET-STRING-CHARS USING BY VALUE ENV-PTR 4 NAME-REF IS-COPY RETURNING INTO NAME-PTR. SET ADDRESS OF NAME TO NAME-PTR. INITIALIZE NAME-X. PERFORM VARYING I FROM 1 BY 1 UNTIL (I > NAME-LENGTH) MOVE CHAR(I) TO CHAR-X(I) END-PERFORM. EVALUATE TITLE-CODE WHEN 1 DISPLAY "Hello, Mr. ", NAME-X WHEN 2 DISPLAY "Hello, Ms. ", NAME-X WHEN OTHER DISPLAY "Hello, ", NAME-X END-EVALUATE. GOBACK.
PROCESS NOMONOPRC NOSTDTRUNC OPTIONS THREAD(SERIALIZE). 1 *** COBOL native program called from Java *** instance method IDENTIFICATION DIVISION. PROGRAM-ID. "Java_Bye_displayBye". 2 Author. INSTALLATION. IBM Toronto Lab. DATE-WRITTEN. DATE-COMPILED. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-ISERIES OBJECT-COMPUTER. IBM-ISERIES INPUT-OUTPUT SECTION. FILE-CONTROL. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 IS-COPY PIC 1. 01 NAME-PTR USAGE POINTER. 01 NAME-LENGTH PIC 9(4) BINARY. 01 I PIC 9(4) BINARY. 01 NAME-X. 05 CHAR-X OCCURS 20 TIMES PIC X. LINKAGE SECTION. *** JNI interface function table COPY JNI. 3 01 NAME. 05 CHAR OCCURS 20 TIMES PIC N USAGE NATIONAL. 01 ENV-PTR USAGE POINTER. 01 OBJECT-REF PIC S9(9) BINARY. 01 TITLE-CODE PIC S9(9) BINARY. 01 NAME-REF PIC S9(9) BINARY. 01 INTERFACE-PTR USAGE POINTER.
PROCEDURE DIVISION USING BY VALUE ENV-PTR 4 OBJECT-REF TITLE-CODE NAME-REF. MAIN-LINE SECTION. MAIN-PROGRAM-LOGIC. SET ADDRESS OF INTERFACE-PTR TO ENV-PTR. SET ADDRESS OF JNI-NATIVE-INTERFACE TO INTERFACE-PTR. *** Callback JNI interface function GET-STRING-LENGTH to *** retrieve the name length CALL GET-STRING-LENGTH USING BY VALUE ENV-PTR 4 NAME-REF RETURNING INTO NAME-LENGTH. *** Callback JNI interface function GET-STRING-CHARS to *** retrieve the name characters CALL GET-STRING-CHARS USING BY VALUE ENV-PTR 4 NAME-REF IS-COPY RETURNING INTO NAME-PTR. SET ADDRESS OF NAME TO NAME-PTR. INITIALIZE NAME-X. PERFORM VARYING I FROM 1 BY 1 UNTIL (I > NAME-LENGTH) MOVE CHAR(I) TO CHAR-X(I) END-PERFORM. EVALUATE TITLE-CODE WHEN 1 DISPLAY "Bye, Mr. ", NAME-X WHEN 2 DISPLAY "Bye, Ms. ", NAME-X WHEN OTHER DISPLAY "Bye, ", NAME-X END-EVALUATE. GOBACK.
To create a COBOL module, use the CRTCBLMOD command, as shown in the examples on the two following screens.
Create COBOL Module (CRTCBLMOD)
Type choices, press Enter.
Module . . . . . . . . . . . . . > BYE Name, *PGMID
Library . . . . . . . . . . . > *CURLIB Name, *CURLIB
Source file . . . . . . . . . . > QCBLLESRC Name
Library . . . . . . . . . . . > *LIBL Name, *LIBL, *CURLIB
Source member . . . . . . . . . > BYE Name, *MODULE
Source stream file . . . . . . .
Output . . . . . . . . . . . . . *PRINT *PRINT, *NONE
Generation severity level . . . 30 0-30
Text 'description' . . . . . . . *SRCMBRTXT
Additional Parameters
Replace module . . . . . . . . . > *YES *YES, *NO
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to use this display F24=More keys
Create COBOL Module (CRTCBLMOD)
Type choices, press Enter.
Module . . . . . . . . . . . . . > HELLO Name, *PGMID
Library . . . . . . . . . . . > *CURLIB Name, *CURLIB
Source file . . . . . . . . . . > QCBLLESRC Name
Library . . . . . . . . . . . > *LIBL Name, *LIBL, *CURLIB
Source member . . . . . . . . . > HELLO Name, *MODULE
Source stream file . . . . . . .
Output . . . . . . . . . . . . . *PRINT *PRINT, *NONE
Generation severity level . . . 30 0-30
Text 'description' . . . . . . . *SRCMBRTXT
Additional Parameters
Replace module . . . . . . . . . > *YES *YES, *NO
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to use this display F24=More keys
Bind the module or modules into a service program, using the CRTSRVPGM command as shown below. Specify the EXPORT option.
Create Service Program (CRTSRVPGM)
Type choices, press Enter.
Service program . . . . . . . . SRVPGM > HELLOBYE
Library . . . . . . . . . . . > *CURLIB
Module . . . . . . . . . . . . . MODULE > HELLO
Library . . . . . . . . . . . > *CURLIB
+ for more values > BYE
> *CURLIB
Export . . . . . . . . . . . . . EXPORT > *ALL
Export source file . . . . . . . SRCFILE QSRVSRC
Library . . . . . . . . . . . *LIBL
Export source member . . . . . . SRCMBR *SRVPGM
Text 'description' . . . . . . . TEXT *BLANK
More...
F3=Exit F4=Prompt F5=Refresh F12=Cancel F13=How to use this display
F24=More keys
This section describes how to code a Java program that calls a COBOL program. The guidelines are illustrated in two sample Java programs, which call the COBOL programs that were shown in a previous section.
Java source files are stored in the Integrated File System (IFS). You can use the stream file editor, EDTF, to edit these files.
If your Java program will call a COBOL program:
You can specify the short name (the name without the argument signature). The JVM will look for a method with this name in the native library; if that fails, the JVM will look for the long name. If you want to overload another native method, use the long name. If a native method has the same name as a Java method, you do not need to specify the long name because the Java method will not exist in the native library.
class Hello {
static {
System.loadLibrary("HELLOBYE"); 1
}
static native void displayHello(int parm1, String parm2); 2
public static void main(String[ ] args) {
int titleCode;
String name;
switch (args.length) {
case 1:
titleCode = Integer.parseInt(args[0]);
name = "Someone";
break;
case 2:
titleCode = Integer.parseInt(args[0]);
name = args[1];
break;
default:
titleCode = 0;
name = "Someone";
break;
}
displayHello(titleCode, name);
Bye bye = new Bye( );
bye.displayBye(titleCode, name);
}
} class Bye {
static {
System.loadLibrary("HELLOBYE"); 1
}
static native void displayBye(int parm1, String parm2); 2
}To compile the Java source programs, you can enter the Qshell interpreter (QSH) and issue the following commands:
javac Hello.java javac Bye.java
To invoke the Java source programs, you can enter the Qshell interpreter (QSH) and issue the following commands:
>java Hello Hello, Someone Bye, Someone >java Hello 1 Hello, Mr. Someone Bye, Mr. Someone >java Hello 2 USA Hello, Ms. USA Bye, Ms. USA
You can use the javah tool to generate header files for the Java programs. These header files are used by C and C++ compilers, not by the COBOL compiler, but you might find them useful for checking the naming of native programs.
javah -jni Hello javah -jni Bye
To call a Java method from a COBOL program, perform the following steps:
This section describes how to code a COBOL program that calls Java methods. The guidelines are illustrated in a sample COBOL program and a sample Java program.
If your COBOL program will call a Java method:
For detailed information about the parameters associated with these invocation API functions, refer to Java Native Interface Specification Release 1.1 (Revised May, 1997).
In the example below:
COBOL Program HELLOWORLD
PROCESS MAP NOMONOPRC OPTIONS THREAD(SERIALIZE). 1 Author. INSTALLATION. IBM Toronto Lab. DATE-WRITTEN. DATE-COMPILED. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-ISERIES. OBJECT-COMPUTER. IBM-ISERIES. INPUT-OUTPUT SECTION. FILE-CONTROL. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. *** JDK 1.2 VM initialization arguments 01 VM-INIT-ARGS. 05 VERSION PIC S9(9) BINARY VALUE 65538. 05 NUMBER-OF-OPTIONS PIC S9(9) BINARY. 05 OPTIONS-PTR USAGE POINTER. 05 FILLER PIC X(1). 01 VM-OPTIONS. 05 OPTIONS-STRING-PTR USAGE POINTER. 05 EXTRA-INFO-PTR USAGE POINTER. *** 01 JVM-PTR USAGE POINTER. 01 ENV-PTR USAGE POINTER. 01 RC1 PIC S9(9) BINARY VALUE 1. 01 RC2 PIC S9(9) BINARY VALUE 1. 01 RC3 PIC S9(9) BINARY VALUE 1. 01 CLASS-NAME PIC X(30). 01 CLASS-NAME-PTR USAGE POINTER. 01 METHOD-NAME PIC X(30). 01 METHOD-NAME-PTR USAGE POINTER. 01 SIGNATURE-NAME PIC X(30). 01 SIGNATURE-NAME-PTR USAGE POINTER. *** CLASSPATH Parameters 01 CLASSPATH PIC X(500). *** Object Reference Variables 01 MY-CLASS-REF PIC S9(9) BINARY. 01 STRING-CLASS-REF PIC S9(9) BINARY. 01 METHOD-ID PIC S9(9) BINARY. 01 INIT-METHOD-ID PIC S9(9) BINARY. 01 STATIC-METHOD-ID PIC S9(9) BINARY. 01 OBJECT-REF PIC S9(9) BINARY. 01 ARG-REF PIC S9(9) BINARY. 01 STRING-REF PIC S9(9) BINARY. *** Parameter Array for calling METHODA 01 PARM-ARRAY. 05 PARM-ARRAY-ELEMENT OCCURS 10 TIMES. 10 PARM-ARRAY-ELEMENT-VALUE PIC S9(9) BINARY. 10 FILLER PIC X(4). 01 PARM-ARRAY-PTR USAGE POINTER. LINKAGE SECTION. *** JNI interface function table COPY JNI. 2 01 INTERFACE-PTR USAGE POINTER. 01 JVM PIC S9(9) BINARY. PROCEDURE DIVISION. MAIN-LINE SECTION. MAIN-PROGRAM-LOGIC. *** In V5R3, the procedure call JNI_GetDefaultJavaVMInitArgs *** is no longer required. *** Retrieve default JVM initiliazion arguments * * SET VM-ARGS-PTR TO ADDRESS OF VM-INIT-ARGS. * CALL PROCEDURE "JNI_GetDefaultJavaVMInitArgs" * USING VM-INIT-ARGS * RETURNING INTO RC1. * * DISPLAY RC1. * *** Append my classpath (:/home/myclass) to CLASSPATH * * SET ADDRESS OF CLASSPATH-DEFAULT TO CLASSPATH. * STRING FUNCTION UTF8STRING("-Djava.class.path=/home/myclass") 3a DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO CLASSPATH SET OPTIONS-STRING-PTR TO ADDRESS OF CLASSPATH. MOVE 1 TO NUMBER-OF-OPTIONS. SET OPTIONS-PTR TO ADDRESS OF VM-OPTIONS. *** Load and initializes the Java VM 3b CALL PROCEDURE "JNI_CreateJavaVM" USING JVM-PTR ENV-PTR VM-INIT-ARGS RETURNING INTO RC2. DISPLAY RC2. SET ADDRESS OF INTERFACE-PTR TO ENV-PTR. SET ADDRESS OF JNI-NATIVE-INTERFACE TO INTERFACE-PTR. *** Callback JNI interface function FIND-CLASS "HelloWorld" STRING FUNCTION UTF8STRING("HelloWorld") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO CLASS-NAME. SET CLASS-NAME-PTR TO ADDRESS OF CLASS-NAME. CALL FIND-CLASS USING BY VALUE ENV-PTR CLASS-NAME-PTR RETURNING INTO MY-CLASS-REF. DISPLAY MY-CLASS-REF. *** Callback JNI interface function FIND-CLASS "java/lang/String" STRING FUNCTION UTF8STRING("java/lang/String") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO CLASS-NAME. SET CLASS-NAME-PTR TO ADDRESS OF CLASS-NAME. CALL FIND-CLASS USING BY VALUE ENV-PTR CLASS-NAME-PTR RETURNING INTO STRING-CLASS-REF. DISPLAY STRING-CLASS-REF. *** Callback JNI interface function GET-METHOD-ID "<init>" *** to retrieve constructor method ID STRING FUNCTION UTF8STRING("<init>") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO METHOD-NAME. STRING FUNCTION UTF8STRING("()V") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO SIGNATURE-NAME. SET METHOD-NAME-PTR TO ADDRESS OF METHOD-NAME. SET SIGNATURE-NAME-PTR TO ADDRESS OF SIGNATURE-NAME. CALL GET-METHOD-ID USING BY VALUE ENV-PTR MY-CLASS-REF METHOD-NAME-PTR SIGNATURE-NAME-PTR RETURNING INTO INIT-METHOD-ID. DISPLAY INIT-METHOD-ID. *** Callback JNI interface function NEW-OBJECT "HelloWorld" CALL NEW-OBJECT USING BY VALUE ENV-PTR MY-CLASS-REF INIT-METHOD-ID RETURNING INTO OBJECT-REF. DISPLAY OBJECT-REF. *** Callback JNI interface function GET-STATIC-METHOD-ID "main" STRING FUNCTION UTF8STRING("main") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO METHOD-NAME. STRING FUNCTION UTF8STRING("([Ljava/lang/String;)V") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO SIGNATURE-NAME. SET METHOD-NAME-PTR TO ADDRESS OF METHOD-NAME. SET SIGNATURE-NAME-PTR TO ADDRESS OF SIGNATURE-NAME. CALL GET-STATIC-METHOD-ID USING BY VALUE ENV-PTR MY-CLASS-REF METHOD-NAME-PTR SIGNATURE-NAME-PTR RETURNING INTO STATIC-METHOD-ID. DISPLAY STATIC-METHOD-ID. *** Callback JNI interface function NEW-OBJECT-ARRAY CALL NEW-OBJECT-ARRAY USING BY VALUE ENV-PTR 0 STRING-CLASS-REF 0 RETURNING INTO ARG-REF. DISPLAY ARG-REF. *** Callback JNI interface function CALL-STATIC-VOID-METHODA SET PARM-ARRAY-PTR TO ADDRESS OF PARM-ARRAY. INITIALIZE PARM-ARRAY. MOVE ARG-REF TO PARM-ARRAY-ELEMENT-VALUE(1). CALL CALL-STATIC-VOID-METHODA USING BY VALUE ENV-PTR MY-CLASS-REF STATIC-METHOD-ID PARM-ARRAY-PTR. *** Callback JNI interface function GET-METHOD-ID "display" STRING FUNCTION UTF8STRING("display") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO METHOD-NAME. STRING FUNCTION UTF8STRING("([II)V") DELIMITED BY SIZE X"00" DELIMITED BY SIZE INTO SIGNATURE-NAME. SET METHOD-NAME-PTR TO ADDRESS OF METHOD-NAME. SET SIGNATURE-NAME-PTR TO ADDRESS OF SIGNATURE-NAME. CALL GET-METHOD-ID USING BY VALUE ENV-PTR MY-CLASS-REF METHOD-NAME-PTR SIGNATURE-NAME-PTR RETURNING INTO METHOD-ID. DISPLAY METHOD-ID. *** Callback JNI interface function NEW-INT-ARRAY CALL NEW-INT-ARRAY USING BY VALUE ENV-PTR 10 RETURNING INTO ARG-REF. DISPLAY ARG-REF. *** Callback JNI interface function CALL-VOID-METHODA SET PARM-ARRAY-PTR TO ADDRESS OF PARM-ARRAY. INITIALIZE PARM-ARRAY. MOVE ARG-REF TO PARM-ARRAY-ELEMENT-VALUE(1). MOVE 2 TO PARM-ARRAY-ELEMENT-VALUE(2). CALL CALL-VOID-METHODA USING BY VALUE ENV-PTR OBJECT-REF METHOD-ID PARM-ARRAY-PTR. *** Destroy the Java VM 3c SET ADDRESS OF JVM TO JVM-PTR. CALL PROCEDURE "DestroyJavaVM" USING JVM RETURNING INTO RC3. DISPLAY RC3. GOBACK.
To create a COBOL module, use the CRTBNDCBL command, as shown below.
Create Bound COBOL Program (CRTBNDCBL)
Type choices, press Enter.
Program . . . . . . . . . . . . > HELLOWORLD Name, *PGMID
Library . . . . . . . . . . . *CURLIB Name, *CURLIB
Source file . . . . . . . . . . > QCBLLESRC Name
Library . . . . . . . . . . . > *CURLIB Name, *LIBL, *CURLIB
Source member . . . . . . . . . > HELLOWORLD Name, *PGM
Source stream file . . . . . . .
Output . . . . . . . . . . . . . *PRINT *PRINT, *NONE
Generation severity level . . . 30 0-30
Text 'description' . . . . . . . *SRCMBRTXT
Additional Parameters
Replace program . . . . . . . . > *YES *YES, *NO
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to use this display F24=More keys
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
void display(int[] args, int i) {
System.out.println("Length of integer array is " + args.length);
System.out.println("Value of integer variable is " + i);
System.out.println("Bye World");
}
}To compile the Java source program, you can enter the Qshell interpreter (QSH) and issue the following command:
javac HelloWorld.java
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.