Java(TM) プログラムから COBOL プログラムを呼び出すには、以下のステップを実行してください。
このセクションでは、Java プログラムによって呼び出される COBOL プログラムをコーディングする方法について説明します。 ガイドラインを 2 つの COBOL プログラム例で示します。 後のセクションで、これらの COBOL プログラムと対話する 2 つの Java プログラムを示します。
COBOL プログラムを Java プログラムで呼び出す場合には、以下のようにしてください。
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.
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.
COBOL モジュールを作成するには、以下の 2 つの画面の例に示すように、 CRTCBLMOD コマンドを使用します。
COBOL モジュールの作成 (CRTCBLMOD) 選択項目を入力して、実行キーを押してください。 モジュール . . . . . . . . . . . > BYE 名前 , *PGMID ライブラリー. . . . . . . . . . > *CURLIB 名前 , *CURLIB ソース・ファイル . . . . . . . . > QCBLLESRC 名前 ライブラリー . . . . . . . . . > *LIBL 名前 , *LIBL, *CURLIB ソース・メンバー . . . . . . . . > BYE 名前 , *MODULE ソース・ストリーム・ファイル 生成重大度レベル . . . . . . . . 30 0-30 テキスト記述 . . . . . . . . . . *SRCMBRTXT 追加のパラメーター モジュールの置き換え . . . . . . > *YES *YES, *NO 終わり F3= 終了 F4= プロンプト F5= 最新表示 F10= 追加のパラメーター F12= 取り消し F13= この画面の使用法 F24= キーの続き
COBOL モジュールの作成 (CRTCBLMOD) 選択項目を入力して、実行キーを押してください。 モジュール . . . . . . . . . . . > HELLO 名前 , *PGMID ライブラリー. . . . . . . . . . > *CURLIB 名前 , *CURLIB ソース・ファイル . . . . . . . . > QCBLLESRC 名前 ライブラリー . . . . . . . . . > *LIBL 名前 , *LIBL, *CURLIB ソース・メンバー . . . . . . . . > HELLO 名前 , *MODULE ソース・ストリーム・ファイル 生成重大度レベル . . . . . . . . 30 0-30 テキスト記述 . . . . . . . . . . *SRCMBRTXT 追加のパラメーター モジュールの置き換え . . . . . . > *YES *YES, *NO 終わり F3= 終了 F4= プロンプト F5= 最新表示 F10= 追加のパラメーター F12= 取り消し F13= この画面の使用法 F24= キーの続き
以下に示したように、CRTSRVPGM コマンドを使用して、1 つまたは複数のモジュールを 1 つのサービス・プログラムにバインドします。 EXPORT オプションを指定してください。
サービス・プログラムの作成 (CRTSRVPGM) 選択項目を入力して、実行キーを押してください。 サービス・プログラム . . . . . . SRVPGM > HELLOBYE ライブラリー . . . . . . . . . > *CURLIB モジュール . . . . . . . . . . . MODULE > HELLO ライブラリー . . . . . . . . . > *CURLIB 値の続きは + > BYE > *CURLIB エクスポート . . . . . . . . . . EXPORT > *ALL ソース・ファイルのエクスポート . SRCFILE QSRVSRC ライブラリー . . . . . . . . *LIBL ソース・メンバーのエクスポート . SRCMBR *SRVPGM テキスト '記述' . . . . . . . . TEXT *BLANK 続く... F3= 終了 F4= プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
このセクションでは、COBOL プログラムを呼び出す Java プログラムをコーディングする方法について説明します。 上記の COBOL プログラムを呼び出す 2 つの Java プログラム例で、ガイドラインを示します。
Java ソース・ファイルは統合ファイル・システム (IFS) に保管されています。 これらのファイルは、ストリーム・ファイル・エディターである EDTF を使用して編集することができます。
Java プログラムで COBOL プログラムを呼び出すには、以下のステップを実行してください。
短い名前 (引き数シグニチャーがない名前) を指定することができます。 JVM は、この名前を持つメソッドをネイティブ・ライブラリーで探します。 見つからない場合、JVM はロング・ネームを探します。 別のネイティブ・メソッドを多重定義したい場合には、ロング・ネームを使用してください。 ネイティブ・メソッドが Java メソッドと同じ名前を持っている場合には、Java メソッドはネイティブ・ライブラリーに存在していないので、ロング・ネームを指定する必要はありません。
class Hello { static { System.loadLibrary("HELLOBYE"); 1 } static native void displayHello(int parm1, String parm2); 2 public static void main(String[ ] args) { int titleCode; String name; switch (args.length) { case 1: titleCode = Integer.parseInt(args[0]); name = "Someone"; break; case 2: titleCode = Integer.parseInt(args[0]); name = args[1]; break; default: titleCode = 0; name = "Someone"; break; } displayHello(titleCode, name); Bye bye = new Bye( ); bye.displayBye(titleCode, name); } }
class Bye { static { System.loadLibrary("HELLOBYE"); 1 } static native void displayBye(int parm1, String parm2); 2 }
Java ソース・プログラムをコンパイルするために、Qshell インタープリター (QSH) を開始して、以下のコマンドを実行することができます。
javac Hello.java javac Bye.java
Java ソース・プログラムを起動するために、Qshell インタープリター (QSH) を開始して、以下のコマンドを実行することができます。
>java Hello Hello, Someone Bye, Someone >java Hello 1 Hello, Mr. Someone Bye, Mr. Someone >java Hello 2 USA Hello, Ms. USA Bye, Ms. USA
javah ツールを使用すれば、Java プログラムのヘッダー・ファイルを生成することができます。 これらのヘッダー・ファイルは、COBOL コンパイラーではなく、C および C++ コンパイラーによって使用されますが、ネイティブ・プログラムの命名を検査する場合に役立ちます。
javah -jni Hello javah -jni Bye
COBOL プログラムから Java メソッドを呼び出すには、以下のステップを実行してください。
このセクションでは、Java メソッドを呼び出す COBOL プログラムをコーディングする方法について説明します。 ガイドラインを、COBOL プログラム例と Java プログラム例で示します。
COBOL プログラムで Java メソッドを呼び出す場合には、以下のようにしてください。
このような呼び出し API 関数に関連するパラメーターの詳細については、「Java Native Interface Specification Release 1.1 (Revised May, 1997)」を参照してください。
以下の例で、
COBOL プログラム HELLOWORLD
PROCESS MAP NOMONOPRC OPTIONS THREAD(SERIALIZE). 1 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. 2 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. * STRING FUNCTION UTF8STRING("-Djava.class.path=/home/myclass") 3a 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 initializes the Java VM 3b 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. 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 3c SET ADDRESS OF JVM TO JVM-PTR. CALL PROCEDURE "DestroyJavaVM" USING JVM RETURNING INTO RC3. DISPLAY RC3. GOBACK.
COBOL モジュールを作成するには、以下に示したように CRTBNDCBL コマンドを使用します。
バインド COBOL PGM の作成 (CRTBNDCBL) 選択項目を入力して、実行キーを押してください。 プログラム . . . . . . . . . . . > HELLOWORLD 名前, *PGMID ライブラリー. . . . . . . . . *CURLIB 名前, *CURLIB ソース・ファイル . . . . . . . . > QCBLLESRC 名前 ライブラリー . . . . . . . . . > *CURLIB 名前, *LIBL, *CURLIB ソース・メンバー . . . . . . . . > HELLOWORLD 名前, *PGM ソース・ストリーム・ファイル 生成重大度レベル . . . . . . . . 30 0-30 テキスト記述 . . . . . . . . . . *SRCMBRTXT 追加のパラメーター プログラムの置き換え . . . . . . > *YES *YES, *NO 終わり F3= 終了 F4= プロンプト F5= 最新表示 F10= 追加のパラメーター F12= 取り消し F13= この画面の使用法 F24= キーの続き
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"); } }
Java ソース・プログラムをコンパイルするために、Qshell インタープリター (QSH) を開始して、以下のコマンドを実行することができます。
javac HelloWorld.java
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.