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
Manage My Notification Subscriptions