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"}]
Was this topic helpful?
Document Information
Modified date:
27 June 2019
UID
ibm10957595