ILE COBOL Programmer's Guide

Calling Java Methods from a COBOL Program

To call a Java method from a COBOL program, perform the following steps:

Code the COBOL Program

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:

  1. Use the PROCESS statement NOMONOPRC (for case-sensitive names) and the option THREAD(SERIALIZE).
  2. Copy the JDKINIT and JNI members. For listings of these members, see Member JNI and Member JDK11INIT.
  3. Call the appropriate Java invocation API functions. The following API functions are available:

    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:

    1. Specify the classpath for the JVM.
    2. The JVM is invoked.
    3. The DestroyJavaVM( ) procedure unloads the JVM and reclaims its resources.

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.
 
 
 

Create the COBOL Program

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                               |
|                                                                                |
+--------------------------------------------------------------------------------+

Code the Java Program

Figure 65. Java Program HelloWorld.java


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");
 
     }
 
}

Compile the Java Program

To compile the Java source program, you can enter the Qshell interpreter (QSH) and issue the following command:

  javac HelloWorld.java


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]