Code the COBOL Program

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:
  1. Use the PROCESS statement NOMONOPRC (for case-sensitive names) and the option THREAD(SERIALIZE). When the COBOL program is invoked from a Java program, it will run in a Java thread. Specify the NOSTDTRUNC Process option to preserve the content of binary data items.
  2. Identify the COBOL program with a name that consists of:
    • The prefix Java_
    • A mangled fully-qualified class name
    • An underscore (_) separator
    • A mangled method name
    • For an overloaded native method, two underscores (__) followed by the mangled argument signature.
  3. Copy the predefined interface function table into the program. For a listing of the predefined interface function table, see Member JNI.
  4. To pass a variable from a COBOL program to a Java program, specify the BY VALUE phrase on the CALL. Receive the following arguments, in the following order:
    1. The JNI interface pointer
    2. A reference to the Java class (for a static native method) or to the object (for a nonstatic native method)
    3. Any additional arguments that are required. These arguments correspond to regular Java method arguments.
    Note that COBOL and Java data types are not completely equivalent. See COBOL and Java Data Types.
Figure 1. COBOL Program HELLO
 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.

COBOL Program BYE

  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.