Troubleshooting
Problem
This example uses two includes that can be found in QSYSINC/QCBLLESRC. Note that the include is for JDK 11INIT is based off the Java Native Interface Specifications for Release 1.1.
Resolving The Problem
This example uses two includes that can be found in QSYSINC/QCBLLESRC. Note that the include is for JDK 11INIT is based off the Java Native Interface Specifications for Release 1.1. We provide an include for JDK 1.1.x only. If you are not using JDK 1.1.x, find the Java Native Interface Specifications for the release you will be using, and modify the copybook.
Note the lines in red that must be changed.
Source for COBOL program:
PROCESS MAP NOMONOPRC NOSTDTRUNC OPTIONS THREAD(SERIALIZE).
*** COBOL calls to invoke Java methods
*****************************************************************
* Taken from the ILE COBOL Programmer's Guide Ch 10 - Fig 63. *
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLOWORLD.
Author.
INSTALLATION.
DATE-WRITTEN.
DATE-COMPILED.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
*** JDK 1.1 VM initialization arguments
COPY JDK11INIT.
01 JVM-PTR USAGE POINTER.
01 ENV-PTR USAGE POINTER.
01 VM-ARGS-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(45).
01 SIGNATURE-NAME-PTR USAGE POINTER.
*** Parameters for QDCXLATE- EBCDIC to ASCII translation
01 QDCXLATE-TABLE PIC X(10) VALUE "QASCII".
01 QDCXLATE-TABLE1 PIC X(10) VALUE "QEBCDIC".
*** CLASSPATH Parameters
01 CLASSPATH-LENGTH PIC 9(5) COMP-3 VALUE 14. These two must be changed
01 CLASSPATH-STRING PIC X(14) VALUE ":/home/myclass". to match the path to the Java
01 CLASSPATH-NEW PIC X(500). program.
*** "HelloWorldCbl" CLASS Parameters
01 HELLOWORLD-CLASS-LENGTH PIC 9(5) COMP-3 VALUE 13.
01 HELLOWORLD-CLASS-STRING PIC X(13) VALUE "HelloWorldCbl".
*** "java/lang/String" CLASS Parameters
01 STRING-CLASS-LENGTH PIC 9(5) COMP-3 VALUE 16.
01 STRING-CLASS-STRING PIC X(16) VALUE "java/lang/String".
*** "<init>" METHOD Parameters
01 INIT-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 INIT-METHOD-STRING PIC X(6) VALUE "<init>".
01 INIT-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 3.
01 INIT-SIGNATURE-STRING PIC X(3) VALUE "()V".
*** "main" METHOD Parameters
01 MAIN-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 4.
01 MAIN-METHOD-STRING PIC X(4) VALUE "main".
01 MAIN-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 22.
01 MAIN-SIGNATURE-STRING PIC X(22) VALUE
X"285B4C6A6176612F6C616E672F537472696E673B2956".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([Ljava/lang/String;)V".
*** "display" METHOD Parameters
01 DISPLAY-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 7.
01 DISPLAY-METHOD-STRING PIC X(7) VALUE "display".
01 DISPLAY-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 DISPLAY-SIGNATURE-STRING PIC X(6) VALUE
X"285B49492956".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([II)V".
*** "addone" METHOD Parameters
01 ADDONE-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 ADDONE-METHOD-STRING PIC X(6) VALUE "addone".
01 ADDONE-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 ADDONE-SIGNATURE-STRING PIC X(6) VALUE
X"285B49492949".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([II)I".
*** "dspchr" METHOD Parameters
*** X"28285B4C6A6176612F6C616E672F537472696E673B29".
01 DSPCHR-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 DSPCHR-METHOD-STRING PIC X(6) VALUE "dspchr".
01 DSPCHR-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 39.
01 DSPCHR-SIGNATURE-STRING.
* 05 DSPCHR-SIG1 PIC X(22) VALUE
05 DSPCHR-SIG1 PIC X(21) VALUE
X"285B4C6A6176612F6C616E672F537472696E673B29".
05 DSPCHR-SIG2 PIC X(19) VALUE
X"5B4C6A6176612F6C616E672F537472696E673B".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "(([Ljava/lang/String;)[Ljava/lang/String;".
*** 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.
01 RETURN-INT PIC S9(9) BINARY.
01 MY-PTR USAGE POINTER.
*** 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.
01 STRING-ONE-VALUE PIC X(10) VALUE "First Parm".
01 STRING-ONE-LENGTH PIC 9(5) COMP-3 VALUE 10.
01 STRING-TWO-VALUE PIC X(11) VALUE "Second Parm".
01 STRING-TWO-LENGTH PIC 9(5) COMP-3 VALUE 11.
01 STRING-THREE-VALUE PIC X(10) VALUE "Third Parm".
01 STRING-THREE-LENGTH PIC 9(5) COMP-3 VALUE 10.
01 STRING-FOUR-VALUE PIC X(11) VALUE "Fourth Parm".
01 STRING-FOUR-LENGTH PIC 9(5) COMP-3 VALUE 11.
01 STRING-PTR USAGE POINTER.
01 STRING-OBJECT-PTR USAGE POINTER.
01 STRING-UTF-LENGTH PIC S9(9) BINARY.
01 STRING-OBJECT-REF PIC S9(9) BINARY.
01 ARRAY-OBJECT-REF PIC S9(9) BINARY.
01 ARRAY-LENGTH PIC S9(9) BINARY.
01 ARRAY-INDEX PIC S9(9) BINARY.
01 RETURN-STRING-VALUE PIC X(40).
LINKAGE SECTION.
*** JNI interface function table
COPY JNI.
01 INTERFACE-PTR USAGE POINTER.
01 JVM PIC S9(9) BINARY.
01 CLASSPATH-DEFAULT PIC X(550).
01 MY-STRING PIC X(11).
PROCEDURE DIVISION.
MAIN-LINE SECTION.
MAIN-PROGRAM-LOGIC.
*** Retrieve default JVM initialization arguments
SET VM-ARGS-PTR TO ADDRESS OF VM-INIT-ARGS.
CALL PROCEDURE "JNI_GetDefaultJavaVMInitArgs"
USING VM-INIT-ARGS
RETURNING INTO RC1.
* DISPLAY "JNI_GetDefaultJavaVMInitArgs: " RC1.
*** Append my classpath (:/home/myclass) to CLASSPATH
SET ADDRESS OF CLASSPATH-DEFAULT TO CLASSPATH.
CALL "QDCXLATE" USING CLASSPATH-LENGTH
CLASSPATH-STRING
QDCXLATE-TABLE.
STRING CLASSPATH-DEFAULT DELIMITED BY X"00"
CLASSPATH-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO CLASSPATH-NEW.
SET CLASSPATH TO ADDRESS OF CLASSPATH-NEW.
*** Load and initialize the Java VM
CALL PROCEDURE "JNI_CreateJavaVM"
USING JVM-PTR ENV-PTR VM-INIT-ARGS
RETURNING INTO RC2.
* DISPLAY "JNI_CreateJavaVM: " RC2.
SET ADDRESS OF INTERFACE-PTR TO ENV-PTR.
SET ADDRESS OF JNI-NATIVE-INTERFACE TO INTERFACE-PTR.
*** Callback JNI interface function FIND-CLASS "HelloWorldCbl"
CALL "QDCXLATE" USING HELLOWORLD-CLASS-LENGTH
HELLOWORLD-CLASS-STRING
QDCXLATE-TABLE.
STRING HELLOWORLD-CLASS-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 MY-CLASS-REF.
* DISPLAY "Class Ref: " MY-CLASS-REF.
*** Callback JNI interface function FIND-CLASS "java/lang/String"
CALL "QDCXLATE" USING STRING-CLASS-LENGTH
STRING-CLASS-STRING
QDCXLATE-TABLE.
STRING STRING-CLASS-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: " STRING-CLASS-REF.
*** Callback JNI interface function GET-METHOD-ID "<init>"
*** to retrieve constructor method ID
CALL "QDCXLATE" USING INIT-METHOD-LENGTH
INIT-METHOD-STRING
QDCXLATE-TABLE.
STRING INIT-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
CALL "QDCXLATE" USING INIT-SIGNATURE-LENGTH
INIT-SIGNATURE-STRING
QDCXLATE-TABLE.
STRING INIT-SIGNATURE-STRING 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: " INIT-METHOD-ID.
*** Callback JNI interface function NEW-OBJECT "HelloWorldCbl"
CALL NEW-OBJECT USING BY VALUE ENV-PTR
MY-CLASS-REF
INIT-METHOD-ID
RETURNING INTO OBJECT-REF.
* DISPLAY "Object Ref: " OBJECT-REF.
*** Callback JNI interface function GET-STATIC-METHOD-ID "main"
CALL "QDCXLATE" USING MAIN-METHOD-LENGTH
MAIN-METHOD-STRING
QDCXLATE-TABLE.
STRING MAIN-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING MAIN-SIGNATURE-STRING 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: " 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: " 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"
CALL "QDCXLATE" USING DISPLAY-METHOD-LENGTH
DISPLAY-METHOD-STRING
QDCXLATE-TABLE.
STRING DISPLAY-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING DISPLAY-SIGNATURE-STRING 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: " 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: " 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.
*** Callback JNI interface function GET-METHOD-ID "addone"
CALL "QDCXLATE" USING ADDONE-METHOD-LENGTH
ADDONE-METHOD-STRING
QDCXLATE-TABLE.
STRING ADDONE-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING ADDONE-SIGNATURE-STRING 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: " METHOD-ID.
*** Callback JNI interface function CALL-INT-METHODA
DISPLAY "Sent Param Value = "
PARM-ARRAY-ELEMENT-VALUE(2).
CALL CALL-INT-METHODA USING BY VALUE ENV-PTR
OBJECT-REF
METHOD-ID
PARM-ARRAY-PTR
RETURNING INTO RETURN-INT.
DISPLAY "Returned Param Value = "
RETURN-INT.
*** Callback JNI interface function GET-METHOD-ID "dspchr"
*** Callback JNI interface function NEW-STRING-ARRAY
CALL "QDCXLATE" USING DSPCHR-METHOD-LENGTH
DSPCHR-METHOD-STRING
QDCXLATE-TABLE.
STRING DSPCHR-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING DSPCHR-SIGNATURE-STRING 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: " METHOD-ID.
*** Callback JNI interface function NEW-OBJECT-ARRAY
* DISPLAY "Arg Ref: " ARG-REF.
CALL "QDCXLATE" USING STRING-ONE-LENGTH
STRING-ONE-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-ONE-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL NEW-OBJECT-ARRAY USING BY VALUE ENV-PTR
4
STRING-CLASS-REF
STRING-OBJECT-REF
RETURNING INTO ARG-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
0
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-TWO-LENGTH
STRING-TWO-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-TWO-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL GET-STRING-UTF-LENGTH USING BY VALUE ENV-PTR
STRING-OBJECT-REF
RETURNING INTO STRING-UTF-LENGTH.
DISPLAY "STRING TWO LENGTH: " STRING-UTF-LENGTH.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
1
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-THREE-LENGTH
STRING-THREE-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-THREE-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
2
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-FOUR-LENGTH
STRING-FOUR-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-FOUR-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
3
STRING-OBJECT-REF.
INITIALIZE PARM-ARRAY.
MOVE ARG-REF TO PARM-ARRAY-ELEMENT-VALUE(1).
CALL CALL-OBJECT-METHODA USING BY VALUE ENV-PTR
OBJECT-REF
METHOD-ID
PARM-ARRAY-PTR
RETURNING INTO ARRAY-OBJECT-REF.
CALL GET-ARRAY-LENGTH USING BY VALUE ENV-PTR
ARRAY-OBJECT-REF
RETURNING INTO ARRAY-LENGTH.
PERFORM VARYING ARRAY-INDEX FROM 0 BY 1
UNTIL ARRAY-INDEX = ARRAY-LENGTH
DISPLAY "ARRAY-INDEX: " ARRAY-INDEX
CALL GET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARRAY-OBJECT-REF
ARRAY-INDEX
RETURNING INTO STRING-OBJECT-REF
CALL GET-STRING-UTF-LENGTH USING BY VALUE ENV-PTR
STRING-OBJECT-REF
RETURNING INTO STRING-UTF-LENGTH
MOVE STRING-UTF-LENGTH TO STRING-FOUR-LENGTH
SET MY-PTR TO NULL
CALL GET-STRING-UTF-CHARS USING BY VALUE ENV-PTR
STRING-OBJECT-REF
MY-PTR
RETURNING INTO STRING-PTR
SET ADDRESS OF MY-STRING TO STRING-PTR
MOVE MY-STRING TO STRING-FOUR-VALUE
CALL "QDCXLATE" USING STRING-FOUR-LENGTH
STRING-FOUR-VALUE
QDCXLATE-TABLE1
DISPLAY "STRING:" STRING-FOUR-VALUE
CALL RELEASE-STRING-UTF-CHARS USING BY VALUE ENV-PTR
STRING-OBJECT-REF
STRING-PTR
END-PERFORM.
*** Destroy the Java VM
SET ADDRESS OF JVM TO JVM-PTR.
CALL PROCEDURE "DestroyJavaVM"
USING JVM
RETURNING INTO RC3.
DISPLAY "DestroyJavaVM: " RC3.
GOBACK.
Java Code for program HelloWorldCbl.java:
class HelloWorldCbl {
public static void main(String[] args) {
HelloWorldCbl myobj = new HelloWorldCbl();
String[] mystr = new String[4];
System.out.println("Hello World");
mystr[0] = "parm1";
mystr[1] = "parm2";
mystr[2] = "parm3";
mystr[3] = "parm4";
myobj.dspchr(mystr);
}
void display(int[] args, int i) {
System.out.println("Length of integer arrar is " + args.length);
System.out.println("Value of integer variable is " + i);
System.out.println("Bye World");
}
int addone(int[] args, int i) {
++i;
return i;
}
String[] dspchr(String[] args) {
int j;
String newargs[] = new String[args.length];
System.out.println("Value of args 0 " + args[0]);
System.out.println("Value of args 1 " + args[1]);
System.out.println("Value of args 2 " + args[2]);
System.out.println("Value of args 3 " + args[3]);
for (int i = 0; i < args.length; i++) {
j = args.length - i - 1;
newargs[j] = args[i];
}
return newargs;
}
}
Note the lines in red that must be changed.
Source for COBOL program:
PROCESS MAP NOMONOPRC NOSTDTRUNC OPTIONS THREAD(SERIALIZE).
*** COBOL calls to invoke Java methods
*****************************************************************
* Taken from the ILE COBOL Programmer's Guide Ch 10 - Fig 63. *
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLOWORLD.
Author.
INSTALLATION.
DATE-WRITTEN.
DATE-COMPILED.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
*** JDK 1.1 VM initialization arguments
COPY JDK11INIT.
01 JVM-PTR USAGE POINTER.
01 ENV-PTR USAGE POINTER.
01 VM-ARGS-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(45).
01 SIGNATURE-NAME-PTR USAGE POINTER.
*** Parameters for QDCXLATE- EBCDIC to ASCII translation
01 QDCXLATE-TABLE PIC X(10) VALUE "QASCII".
01 QDCXLATE-TABLE1 PIC X(10) VALUE "QEBCDIC".
*** CLASSPATH Parameters
01 CLASSPATH-LENGTH PIC 9(5) COMP-3 VALUE 14. These two must be changed
01 CLASSPATH-STRING PIC X(14) VALUE ":/home/myclass". to match the path to the Java
01 CLASSPATH-NEW PIC X(500). program.
*** "HelloWorldCbl" CLASS Parameters
01 HELLOWORLD-CLASS-LENGTH PIC 9(5) COMP-3 VALUE 13.
01 HELLOWORLD-CLASS-STRING PIC X(13) VALUE "HelloWorldCbl".
*** "java/lang/String" CLASS Parameters
01 STRING-CLASS-LENGTH PIC 9(5) COMP-3 VALUE 16.
01 STRING-CLASS-STRING PIC X(16) VALUE "java/lang/String".
*** "<init>" METHOD Parameters
01 INIT-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 INIT-METHOD-STRING PIC X(6) VALUE "<init>".
01 INIT-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 3.
01 INIT-SIGNATURE-STRING PIC X(3) VALUE "()V".
*** "main" METHOD Parameters
01 MAIN-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 4.
01 MAIN-METHOD-STRING PIC X(4) VALUE "main".
01 MAIN-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 22.
01 MAIN-SIGNATURE-STRING PIC X(22) VALUE
X"285B4C6A6176612F6C616E672F537472696E673B2956".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([Ljava/lang/String;)V".
*** "display" METHOD Parameters
01 DISPLAY-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 7.
01 DISPLAY-METHOD-STRING PIC X(7) VALUE "display".
01 DISPLAY-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 DISPLAY-SIGNATURE-STRING PIC X(6) VALUE
X"285B49492956".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([II)V".
*** "addone" METHOD Parameters
01 ADDONE-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 ADDONE-METHOD-STRING PIC X(6) VALUE "addone".
01 ADDONE-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 ADDONE-SIGNATURE-STRING PIC X(6) VALUE
X"285B49492949".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "([II)I".
*** "dspchr" METHOD Parameters
*** X"28285B4C6A6176612F6C616E672F537472696E673B29".
01 DSPCHR-METHOD-LENGTH PIC 9(5) COMP-3 VALUE 6.
01 DSPCHR-METHOD-STRING PIC X(6) VALUE "dspchr".
01 DSPCHR-SIGNATURE-LENGTH PIC 9(5) COMP-3 VALUE 39.
01 DSPCHR-SIGNATURE-STRING.
* 05 DSPCHR-SIG1 PIC X(22) VALUE
05 DSPCHR-SIG1 PIC X(21) VALUE
X"285B4C6A6176612F6C616E672F537472696E673B29".
05 DSPCHR-SIG2 PIC X(19) VALUE
X"5B4C6A6176612F6C616E672F537472696E673B".
* Note: QDCXLATEwill not translate '[' correctly
* for signature "(([Ljava/lang/String;)[Ljava/lang/String;".
*** 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.
01 RETURN-INT PIC S9(9) BINARY.
01 MY-PTR USAGE POINTER.
*** 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.
01 STRING-ONE-VALUE PIC X(10) VALUE "First Parm".
01 STRING-ONE-LENGTH PIC 9(5) COMP-3 VALUE 10.
01 STRING-TWO-VALUE PIC X(11) VALUE "Second Parm".
01 STRING-TWO-LENGTH PIC 9(5) COMP-3 VALUE 11.
01 STRING-THREE-VALUE PIC X(10) VALUE "Third Parm".
01 STRING-THREE-LENGTH PIC 9(5) COMP-3 VALUE 10.
01 STRING-FOUR-VALUE PIC X(11) VALUE "Fourth Parm".
01 STRING-FOUR-LENGTH PIC 9(5) COMP-3 VALUE 11.
01 STRING-PTR USAGE POINTER.
01 STRING-OBJECT-PTR USAGE POINTER.
01 STRING-UTF-LENGTH PIC S9(9) BINARY.
01 STRING-OBJECT-REF PIC S9(9) BINARY.
01 ARRAY-OBJECT-REF PIC S9(9) BINARY.
01 ARRAY-LENGTH PIC S9(9) BINARY.
01 ARRAY-INDEX PIC S9(9) BINARY.
01 RETURN-STRING-VALUE PIC X(40).
LINKAGE SECTION.
*** JNI interface function table
COPY JNI.
01 INTERFACE-PTR USAGE POINTER.
01 JVM PIC S9(9) BINARY.
01 CLASSPATH-DEFAULT PIC X(550).
01 MY-STRING PIC X(11).
PROCEDURE DIVISION.
MAIN-LINE SECTION.
MAIN-PROGRAM-LOGIC.
*** Retrieve default JVM initialization arguments
SET VM-ARGS-PTR TO ADDRESS OF VM-INIT-ARGS.
CALL PROCEDURE "JNI_GetDefaultJavaVMInitArgs"
USING VM-INIT-ARGS
RETURNING INTO RC1.
* DISPLAY "JNI_GetDefaultJavaVMInitArgs: " RC1.
*** Append my classpath (:/home/myclass) to CLASSPATH
SET ADDRESS OF CLASSPATH-DEFAULT TO CLASSPATH.
CALL "QDCXLATE" USING CLASSPATH-LENGTH
CLASSPATH-STRING
QDCXLATE-TABLE.
STRING CLASSPATH-DEFAULT DELIMITED BY X"00"
CLASSPATH-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO CLASSPATH-NEW.
SET CLASSPATH TO ADDRESS OF CLASSPATH-NEW.
*** Load and initialize the Java VM
CALL PROCEDURE "JNI_CreateJavaVM"
USING JVM-PTR ENV-PTR VM-INIT-ARGS
RETURNING INTO RC2.
* DISPLAY "JNI_CreateJavaVM: " RC2.
SET ADDRESS OF INTERFACE-PTR TO ENV-PTR.
SET ADDRESS OF JNI-NATIVE-INTERFACE TO INTERFACE-PTR.
*** Callback JNI interface function FIND-CLASS "HelloWorldCbl"
CALL "QDCXLATE" USING HELLOWORLD-CLASS-LENGTH
HELLOWORLD-CLASS-STRING
QDCXLATE-TABLE.
STRING HELLOWORLD-CLASS-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 MY-CLASS-REF.
* DISPLAY "Class Ref: " MY-CLASS-REF.
*** Callback JNI interface function FIND-CLASS "java/lang/String"
CALL "QDCXLATE" USING STRING-CLASS-LENGTH
STRING-CLASS-STRING
QDCXLATE-TABLE.
STRING STRING-CLASS-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: " STRING-CLASS-REF.
*** Callback JNI interface function GET-METHOD-ID "<init>"
*** to retrieve constructor method ID
CALL "QDCXLATE" USING INIT-METHOD-LENGTH
INIT-METHOD-STRING
QDCXLATE-TABLE.
STRING INIT-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
CALL "QDCXLATE" USING INIT-SIGNATURE-LENGTH
INIT-SIGNATURE-STRING
QDCXLATE-TABLE.
STRING INIT-SIGNATURE-STRING 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: " INIT-METHOD-ID.
*** Callback JNI interface function NEW-OBJECT "HelloWorldCbl"
CALL NEW-OBJECT USING BY VALUE ENV-PTR
MY-CLASS-REF
INIT-METHOD-ID
RETURNING INTO OBJECT-REF.
* DISPLAY "Object Ref: " OBJECT-REF.
*** Callback JNI interface function GET-STATIC-METHOD-ID "main"
CALL "QDCXLATE" USING MAIN-METHOD-LENGTH
MAIN-METHOD-STRING
QDCXLATE-TABLE.
STRING MAIN-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING MAIN-SIGNATURE-STRING 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: " 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: " 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"
CALL "QDCXLATE" USING DISPLAY-METHOD-LENGTH
DISPLAY-METHOD-STRING
QDCXLATE-TABLE.
STRING DISPLAY-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING DISPLAY-SIGNATURE-STRING 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: " 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: " 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.
*** Callback JNI interface function GET-METHOD-ID "addone"
CALL "QDCXLATE" USING ADDONE-METHOD-LENGTH
ADDONE-METHOD-STRING
QDCXLATE-TABLE.
STRING ADDONE-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING ADDONE-SIGNATURE-STRING 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: " METHOD-ID.
*** Callback JNI interface function CALL-INT-METHODA
DISPLAY "Sent Param Value = "
PARM-ARRAY-ELEMENT-VALUE(2).
CALL CALL-INT-METHODA USING BY VALUE ENV-PTR
OBJECT-REF
METHOD-ID
PARM-ARRAY-PTR
RETURNING INTO RETURN-INT.
DISPLAY "Returned Param Value = "
RETURN-INT.
*** Callback JNI interface function GET-METHOD-ID "dspchr"
*** Callback JNI interface function NEW-STRING-ARRAY
CALL "QDCXLATE" USING DSPCHR-METHOD-LENGTH
DSPCHR-METHOD-STRING
QDCXLATE-TABLE.
STRING DSPCHR-METHOD-STRING DELIMITED BY SIZE
X"00" DELIMITED BY SIZE
INTO METHOD-NAME.
STRING DSPCHR-SIGNATURE-STRING 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: " METHOD-ID.
*** Callback JNI interface function NEW-OBJECT-ARRAY
* DISPLAY "Arg Ref: " ARG-REF.
CALL "QDCXLATE" USING STRING-ONE-LENGTH
STRING-ONE-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-ONE-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL NEW-OBJECT-ARRAY USING BY VALUE ENV-PTR
4
STRING-CLASS-REF
STRING-OBJECT-REF
RETURNING INTO ARG-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
0
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-TWO-LENGTH
STRING-TWO-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-TWO-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL GET-STRING-UTF-LENGTH USING BY VALUE ENV-PTR
STRING-OBJECT-REF
RETURNING INTO STRING-UTF-LENGTH.
DISPLAY "STRING TWO LENGTH: " STRING-UTF-LENGTH.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
1
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-THREE-LENGTH
STRING-THREE-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-THREE-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
2
STRING-OBJECT-REF.
CALL "QDCXLATE" USING STRING-FOUR-LENGTH
STRING-FOUR-VALUE
QDCXLATE-TABLE.
SET STRING-PTR TO ADDRESS OF STRING-FOUR-VALUE.
CALL NEW-STRING-UTF USING BY VALUE ENV-PTR
STRING-PTR
RETURNING INTO STRING-OBJECT-REF.
CALL SET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARG-REF
3
STRING-OBJECT-REF.
INITIALIZE PARM-ARRAY.
MOVE ARG-REF TO PARM-ARRAY-ELEMENT-VALUE(1).
CALL CALL-OBJECT-METHODA USING BY VALUE ENV-PTR
OBJECT-REF
METHOD-ID
PARM-ARRAY-PTR
RETURNING INTO ARRAY-OBJECT-REF.
CALL GET-ARRAY-LENGTH USING BY VALUE ENV-PTR
ARRAY-OBJECT-REF
RETURNING INTO ARRAY-LENGTH.
PERFORM VARYING ARRAY-INDEX FROM 0 BY 1
UNTIL ARRAY-INDEX = ARRAY-LENGTH
DISPLAY "ARRAY-INDEX: " ARRAY-INDEX
CALL GET-OBJECT-ARRAY-ELEMENT USING BY VALUE ENV-PTR
ARRAY-OBJECT-REF
ARRAY-INDEX
RETURNING INTO STRING-OBJECT-REF
CALL GET-STRING-UTF-LENGTH USING BY VALUE ENV-PTR
STRING-OBJECT-REF
RETURNING INTO STRING-UTF-LENGTH
MOVE STRING-UTF-LENGTH TO STRING-FOUR-LENGTH
SET MY-PTR TO NULL
CALL GET-STRING-UTF-CHARS USING BY VALUE ENV-PTR
STRING-OBJECT-REF
MY-PTR
RETURNING INTO STRING-PTR
SET ADDRESS OF MY-STRING TO STRING-PTR
MOVE MY-STRING TO STRING-FOUR-VALUE
CALL "QDCXLATE" USING STRING-FOUR-LENGTH
STRING-FOUR-VALUE
QDCXLATE-TABLE1
DISPLAY "STRING:" STRING-FOUR-VALUE
CALL RELEASE-STRING-UTF-CHARS USING BY VALUE ENV-PTR
STRING-OBJECT-REF
STRING-PTR
END-PERFORM.
*** Destroy the Java VM
SET ADDRESS OF JVM TO JVM-PTR.
CALL PROCEDURE "DestroyJavaVM"
USING JVM
RETURNING INTO RC3.
DISPLAY "DestroyJavaVM: " RC3.
GOBACK.
Java Code for program HelloWorldCbl.java:
class HelloWorldCbl {
public static void main(String[] args) {
HelloWorldCbl myobj = new HelloWorldCbl();
String[] mystr = new String[4];
System.out.println("Hello World");
mystr[0] = "parm1";
mystr[1] = "parm2";
mystr[2] = "parm3";
mystr[3] = "parm4";
myobj.dspchr(mystr);
}
void display(int[] args, int i) {
System.out.println("Length of integer arrar is " + args.length);
System.out.println("Value of integer variable is " + i);
System.out.println("Bye World");
}
int addone(int[] args, int i) {
++i;
return i;
}
String[] dspchr(String[] args) {
int j;
String newargs[] = new String[args.length];
System.out.println("Value of args 0 " + args[0]);
System.out.println("Value of args 1 " + args[1]);
System.out.println("Value of args 2 " + args[2]);
System.out.println("Value of args 3 " + args[3]);
for (int i = 0; i < args.length; i++) {
j = args.length - i - 1;
newargs[j] = args[i];
}
return newargs;
}
}
[{"Type":"MASTER","Line of Business":{"code":"LOB68","label":"Power HW"},"Business Unit":{"code":"BU070","label":"IBM Infrastructure"},"Product":{"code":"SWG60","label":"IBM i"},"ARM Category":[{"code":"a8m3p000000F98bAAC","label":"Programming ILE Languages-\u003ECOBOL"}],"ARM Case Number":"","Platform":[{"code":"PF012","label":"IBM i"}],"Version":"All Versions"}]
Historical Number
28751644
Was this topic helpful?
Document Information
Modified date:
09 December 2024
UID
nas8N1016744