IBM Support

COBOL calling Java methods

How To


Summary

Example COBOL calling Java methods.

Additional Information

Important Note: This code example is provided as-is.  IBM accepts no responsibility for its correctness.

**NOTE: Second call to the program in the same job will fail as the JVM is already active.  Need to start a new job in between program calls.

       PROCESS MAP NOMONOPRC OPTIONS THREAD(SERIALIZE).

      *** COBOL calls to invoke Java methods
       IDENTIFICATION DIVISION.
       PROGRAM-ID.     HELLOWORLD.
       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 IN "QSYSINC-QCBLLESRC".

       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.
      *
      *** Replace mydir in the following with the directory containing
      *** HelloWorld.class you created when you compiled HelloWorld.java
      *** using the javac command
           STRING FUNCTION UTF8STRING("-Djava.class.path=/home/mydir")
                        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 initialzies the Jave VM
      *** This can only be done once in a session, then the Java VM exists
           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.
      ***** following call fails with MCH3601 *****
           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

      ***    SET ADDRESS OF JVM TO JVM-PTR.

      ***   CALL PROCEDURE "DestroyJavaVM"
      ***         USING JVM
      ***         RETURNING INTO RC3.

      ***    DISPLAY RC3.

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

Document Location

Worldwide


[{"Type":"MASTER","Line of Business":{"code":"LOB57","label":"Power"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Platform":[{"code":"PF012","label":"IBM i"}],"Version":"7.1.0"}]

Document Information

More support for:
IBM i

Software version:
7.1.0

Operating system(s):
IBM i

Document number:
957595

Modified date:
27 June 2019

UID

ibm10957595

Manage My Notification Subscriptions