COBOL2002 Javaプログラム呼び出し機能ガイド
ここでは,次に示すJavaプログラムを操作するCOBOLプログラムについて説明します。
public class SampleClass { public static String SampleStaticField; public int SampleField; public static void SampleStaticMethod( int a, double b ) { ... } public int SampleMethod( String a ) { ... } } |
IDENTIFICATION DIVISION. PROGRAM-ID. MAIN. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DYNAMIC LENGTH STRUCTURE C-STRING IS C-STATIC-STRUCTURE. DATA DIVISION. WORKING-STORAGE SECTION. *>--------------------------------------------------------------- *> CBLJENV集団項目の定義 *>--------------------------------------------------------------- 01 CBLJENV. 02 CBLJENVCORE USAGE POINTER VALUE NULL. 02 CBLJEXCEPTION USAGE POINTER VALUE NULL. 02 CBLJFLAGS PIC 1(32) USAGE BIT VALUE ALL B'0'. 02 CBLJSTRMAXLEN PIC S9(9) USAGE COMP VALUE 256. 02 CBLJVMOPTIONS. 03 CBLJOPTCOUNT PIC S9(9) USAGE COMP VALUE 1. 03 CBLJOPTION-1 PIC X(256) VALUE '-Djava.class.path=java'. *>--------------------------------------------------------------- *> クラス名,フィールド名,メソッド名の定義 *>--------------------------------------------------------------- 01 SampleClass PIC X DYNAMIC C-STRING VALUE 'SampleClass'. 01 SampleStaticField PIC X DYNAMIC C-STRING VALUE 'SampleStaticField'. 01 SampleField PIC X DYNAMIC C-STRING VALUE 'SampleField'. 01 SampleStaticMethod PIC X DYNAMIC C-STRING VALUE 'SampleStaticMethod'. 01 SampleMethod PIC X DYNAMIC C-STRING VALUE 'SampleMethod'. *>--------------------------------------------------------------- *> クラス参照・オブジェクト参照の定義 *>--------------------------------------------------------------- 01 CLASSREF USAGE POINTER. 01 OBJREF USAGE POINTER. *>--------------------------------------------------------------- *> 引数リストの定義 (NO-ARGは引数なしメソッド用の引数リスト) *>--------------------------------------------------------------- 01 NO-ARG. 02 FILLER USAGE POINTER VALUE NULL. 01 ARG-LIST. 02 ARGPTR USAGE POINTER OCCURS 3 TIMES. *>--------------------------------------------------------------- *> パラメタ領域の定義(RTN-VOIDはvoid型メソッド用の返却項目指定) *>--------------------------------------------------------------- 01 ARG-INT. 02 ARG-INT-TYPE PIC X(1) VALUE 'I'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 ARG-INT-AREA PIC S9(9) USAGE COMP. 01 ARG-DOUBLE. 02 ARG-DBL-TYPE PIC X(1) VALUE 'D'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 ARG-DBL-AREA USAGE COMP-2. 01 ARG-STRING. 02 ARG-STR-TYPE PIC X(256) VALUE 'Ljava/lang/String;'. 02 ARG-STR-AREA USAGE POINTER. 01 RTN-VOID. 02 RTN-TYPE PIC X(1) VALUE 'V'. 01 RTN-INT. 02 RTN-INT-TYPE PIC X(1) VALUE 'I'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 RTN-INT-AREA PIC S9(9) USAGE COMP. 01 RTN-STRING. 02 RTN-STR-TYPE PIC X(256) VALUE 'Ljava/lang/String;'. 02 RTN-STR-AREA USAGE POINTER. *>--------------------------------------------------------------- *> 作業領域 *>--------------------------------------------------------------- 01 WK-STRING-LEN PIC S9(9) USAGE COMP VALUE 256. 01 WK-STRING PIC X(256). PROCEDURE DIVISION. *> JavaのSampleClassクラスのクラス参照を取得する CALL 'CBLJGETCLASS' USING CBLJENV SampleClass CLASSREF. *> Javaのクラスフィールド(SampleStaticField)に値を設定する MOVE 'HITACHI' TO WK-STRING. CALL 'CBLJXTOSTRING' USING CBLJENV WK-STRING WK-STRING-LEN ARG-STR-AREA. CALL 'CBLJSETSTATICFIELD' USING CBLJENV CLASSREF SampleStaticField ARG-STRING. *> Javaのクラスフィールド(SampleStaticField)から値を取り出す CALL 'CBLJGETSTATICFIELD' USING CBLJENV CLASSREF SampleStaticField RTN-STRING. *> Javaのクラスメソッド(SampleStaticMethod)を呼び出す COMPUTE ARG-INT-AREA = 10. COMPUTE ARG-DBL-AREA = 3.14. COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-INT ). COMPUTE ARGPTR(2) = FUNCTION ADDR( ARG-DOUBLE ). COMPUTE ARGPTR(3) = ZERO. CALL 'CBLJSTATICINVOKE' USING CBLJENV CLASSREF SampleStaticMethod ARG-LIST RTN-VOID. *> Javaのインスタンスを生成する CALL 'CBLJNEW' USING CBLJENV CLASSREF NO-ARG OBJREF. *> Javaのインスタンスフィールド(SampleField)に値を設定する MOVE 100 TO ARG-INT-AREA. CALL 'CBLJSETFIELD' USING CBLJENV OBJREF SampleField ARG-INT. *> Javaのインスタンスフィールド(SampleField)から値を取り出す CALL 'CBLJGETFIELD' USING CBLJENV OBJREF SampleField RTN-INT. *> Javaのインスタンスメソッド(SampleMethod)を呼び出す COMPUTE ARG-STR-AREA = RTN-STR-AREA. COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-STRING ). COMPUTE ARGPTR(2) = ZERO. CALL 'CBLJINVOKE' USING CBLJENV OBJREF SampleMethod ARG-LIST RTN-INT. *> Javaのインスタンスを解放する CALL 'CBLJRELEASE' USING CBLJENV OBJREF. *> Javaの実行環境を削除する CALL 'CBLJFINALIZE' USING CBLJENV. END PROGRAM MAIN. |
Javaプログラム呼び出し機能のサービスルーチンを使用するには,受け渡しで使用するパラメタ領域を定義する必要があります。
CBLJENV集団項目には,Javaの実行環境を保持させるための領域を記述します。
Java VM起動時のパラメタは,CBLJENV集団項目に指定します。ただし,ほかのスレッドのプログラムですでにJava VMが起動されている場合は,CBLJENV集団項目のCBLJVMOPTIONS項目に指定したオプションは適用されません。また,環境変数CBLJVMOPTIONSが指定されているときは,CBLJVMOPTIONS項目の指定は無効となります。
CBLJENV集団項目のCBLJSTRMAXLEN項目には,Javaプログラム呼び出し機能のサービスルーチンに渡す固定長英数字項目の長さを指定します。CBLJVMOPTIONSやパラメタ型集団項目のDATA-TYPE項目では,CBLJSTRMAXLEN項目に指定した長さの英数字項目を指定してください。
CBLJENV集団項目の例を次に示します。
*>--------------------------------------------------------------- *> CBLJENV集団項目の定義 *>--------------------------------------------------------------- 01 CBLJENV. 02 CBLJENVCORE USAGE POINTER VALUE NULL. 02 CBLJEXCEPTION USAGE POINTER VALUE NULL. 02 CBLJFLAGS PIC 1(32) USAGE BIT VALUE ALL B'0'. 02 CBLJSTRMAXLEN PIC S9(9) USAGE COMP VALUE 256. 02 CBLJVMOPTIONS. 03 CBLJOPTCOUNT PIC S9(9) USAGE COMP VALUE 1. 03 CBLJOPTION-1 PIC X(256) VALUE '-Djava.class.path=java'. |
CBLJENV集団項目は,CBLJINITIALIZEサービスルーチンが明示的または暗黙的に呼び出される前に値を設定します。CBLJINITIALIZEサービスルーチンが呼び出されたあとは変更しないでください。
CBLJENV集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(1) CBLJENV集団項目」を参照してください。
パラメタ型集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(3) パラメタ型集団項目」を参照してください。
使用するJava名称(クラス名,フィールド名,およびメソッド名)について,動的長基本項目を使用して次のように記述します。
*>--------------------------------------------------------------- *> クラス名,フィールド名,メソッド名の定義 *>--------------------------------------------------------------- 01 SampleClass PIC X DYNAMIC C-STRING VALUE 'SampleClass'. 01 SampleStaticField PIC X DYNAMIC C-STRING VALUE 'SampleStaticField'. 01 SampleField PIC X DYNAMIC C-STRING VALUE 'SampleField'. 01 SampleStaticMethod PIC X DYNAMIC C-STRING VALUE 'SampleStaticMethod'. 01 SampleMethod PIC X DYNAMIC C-STRING VALUE 'SampleMethod'. |
パッケージ名付きのクラス名を記述する場合は,ピリオドではなく,スラントを使って区切ります。
java/lang/String
項目名をJava名称と同じにすると,読みやすいプログラムになります。
また,動的長基本項目を使用しない従来の構文を使用した名前型集団項目を使用して定義することもできます。名前型集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(2) 名前型集団項目」を参照してください。
01 MethodName PIC X DYNAMIC C-STRING LIMIT 256. MOVE 'SampleStaticMethod' TO MethodName. CALL 'CBLJSTATICINVOKE' USING CBLJENV CLASSREF MethodName ARG-LIST RTN-VOID. |
01 MethodName 02 NAMESTR PIC X(256). 02 FILLER PIC X VALUE LOW-VALUE. MOVE 'SampleStaticMethod' TO NAMESTR OF MethodName. CALL 'CBLJSTATICINVOKE' USING CBLJENV CLASSREF MethodName ARG-LIST RTN-VOID. |
Javaのメソッドの呼び出しやJavaのフィールドの出し入れで使用する領域を記述します。
引数リストおよびパラメタ領域の例を次に示します。
*>--------------------------------------------------------------- *> 引数リストの定義 (NO-ARGは引数なしメソッド用の引数リスト) *>--------------------------------------------------------------- 01 NO-ARG. 02 FILLER USAGE POINTER VALUE NULL. 01 ARG-LIST. 02 ARGPTR USAGE POINTER OCCURS 3 TIMES. *>--------------------------------------------------------------- *> パラメタ領域の定義(RTN-VOIDはvoid型メソッド用の返却項目指定) *>--------------------------------------------------------------- 01 ARG-INT. 02 ARG-INT-TYPE PIC X(1) VALUE 'I'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 ARG-INT-AREA PIC S9(9) USAGE COMP. 01 ARG-DOUBLE. 02 ARG-DBL-TYPE PIC X(1) VALUE 'D'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 ARG-DBL-AREA USAGE COMP-2. 01 ARG-STRING. 02 ARG-STR-TYPE PIC X(256) VALUE 'Ljava/lang/String;'. 02 ARG-STR-AREA USAGE POINTER. 01 RTN-VOID. 02 RTN-TYPE PIC X(1) VALUE 'V'. 01 RTN-INT. 02 RTN-INT-TYPE PIC X(1) VALUE 'I'. 02 FILLER PIC X(7) VALUE ALL LOW-VALUE. 02 RTN-INT-AREA PIC S9(9) USAGE COMP. 01 RTN-STRING. 02 RTN-STR-TYPE PIC X(256) VALUE 'Ljava/lang/String;'. 02 RTN-STR-AREA USAGE POINTER. |
引数リスト型集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(4) 引数リスト型集団項目」を参照してください。
パラメタ型集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(3) パラメタ型集団項目」を参照してください。
CBLJINITIALIZEサービスルーチンを呼び出して,Javaプログラム呼び出し機能を初期化します。
CBLJINITIALIZEサービスルーチンを呼び出す例を次に示します。
CALL 'CBLJINITIALIZE' USING CBLJENV. |
この例では,最初のCBLJGETCLASSサービスルーチンの呼び出し時に,このサービスルーチンが自動で呼び出されるため,明示的に呼び出していません。
CBLJINITIALIZEサービスルーチンについては,「6.1.2 基本操作」の「(1) CBLJINITIALIZE」を参照してください。
CBLJGETCLASSサービスルーチンを呼び出して,使用するJavaクラスを初期化し,クラス参照を取得します。
CBLJGETCLASSサービスルーチンを呼び出して,JavaのSampleClassクラスのクラス参照を取得する例を次に示します。
*> JavaのSampleClassクラスのクラス参照を取得する CALL 'CBLJGETCLASS' USING CBLJENV SampleClass CLASSREF. |
取得したクラス参照は次の操作で使用します。
CBLJGETCLASSサービスルーチンについては,「6.1.2 基本操作」の「(2) CBLJGETCLASS」を参照してください。
CBLJSETSTATICFIELDサービスルーチン(設定用)またはCBLJGETSTATICFIELDサービスルーチン(取り出し用)を呼び出して,クラス参照とクラスフィールド名を使ってアクセスします。データの受け渡しの領域には,パラメタ型集団項目として定義したデータ項目を指定します。
クラスフィールドにアクセスする例を次に示します。
*> Javaのクラスフィールド(SampleStaticField)に値を設定する MOVE 'HITACHI' TO WK-STRING. CALL 'CBLJXTOSTRING' USING CBLJENV WK-STRING WK-STRING-LEN ARG-STR-AREA. CALL 'CBLJSETSTATICFIELD' USING CBLJENV CLASSREF SampleStaticField ARG-STRING. *> Javaのクラスフィールド(SampleStaticField)から値を取り出す CALL 'CBLJGETSTATICFIELD' USING CBLJENV CLASSREF SampleStaticField RTN-STRING. |
CBLJSETSTATICFIELDサービスルーチンについては,「6.1.2 基本操作」の「(3) CBLJSETSTATICFIELD」を参照してください。
CBLJGETSTATICFIELDサービスルーチンについては,「6.1.2 基本操作」の「(4) CBLJGETSTATICFIELD」を参照してください。
CBLJSTATICINVOKEサービスルーチンを呼び出して,クラス参照とクラスメソッド名を使って呼び出します。
メソッド呼び出しの引数には引数リストを,返却値にはパラメタ型集団項目として定義したデータ項目を指定します。
クラスメソッドを呼び出す例を次に示します。
*> Javaのクラスメソッド(SampleStaticMethod)を呼び出す COMPUTE ARG-INT-AREA = 10. COMPUTE ARG-DBL-AREA = 3.14. COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-INT ). COMPUTE ARGPTR(2) = FUNCTION ADDR( ARG-DOUBLE ). COMPUTE ARGPTR(3) = ZERO. CALL 'CBLJSTATICINVOKE' USING CBLJENV CLASSREF SampleStaticMethod ARG-LIST RTN-VOID. |
CBLJSTATICINVOKEサービスルーチンについては,「6.1.2 基本操作」の「(5) CBLJSTATICINVOKE」を参照してください。
CBLJNEWサービスルーチンを呼び出して,クラス参照を使ってコンストラクタでクラスインスタンスを生成し,オブジェクト参照を取得します。
コンストラクタの引数には引数リストを指定します。
インスタンスを生成する例を次に示します。
*> Javaのインスタンスを生成する CALL 'CBLJNEW' USING CBLJENV CLASSREF NO-ARG OBJREF. |
CBLJNEWサービスルーチンについては,「6.1.2 基本操作」の「(6) CBLJNEW」を参照してください。
CBLJSETFIELDサービスルーチン(設定用)またはCBLJGETFIELDサービスルーチン(取り出し用)で,オブジェクト参照およびインスタンスフィールド名を使ってアクセスします。
データの受け渡しの領域には,パラメタ型集団項目として定義したデータ項目を指定します。
インスタンスフィールドにアクセスする例を次に示します。
*> Javaのインスタンスフィールド(SampleField)に値を設定する MOVE 100 TO ARG-INT-AREA. CALL 'CBLJSETFIELD' USING CBLJENV OBJREF SampleField ARG-INT. *> Javaのインスタンスフィールド(SampleField)から値を取り出す CALL 'CBLJGETFIELD' USING CBLJENV OBJREF SampleField RTN-INT. |
CBLJSETFIELDサービスルーチンについては,「6.1.2 基本操作」の「(7) CBLJSETFIELD」を参照してください。
CBLJINVOKEサービスルーチンで,オブジェクト参照およびインスタンスメソッド名を使って呼び出します。メソッド呼び出しの引数には引数リストを,返却値はパラメタ型集団項目として定義したデータ項目を指定します。
インスタンスメソッドを呼び出す例を次に示します。
*> Javaのインスタンスメソッド(SampleMethod)を呼び出す COMPUTE ARG-STR-AREA = RTN-STR-AREA. COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-STRING ). COMPUTE ARGPTR(2) = ZERO. CALL 'CBLJINVOKE' USING CBLJENV OBJREF SampleMethod ARG-LIST RTN-INT. |
CBLJINVOKEサービスルーチンについては,「6.1.2 基本操作」の「(9) CBLJINVOKE」を参照してください。
CBLJRELEASEサービスルーチンまたはCBLJSETNULLサービスルーチンを使ってインスタンスを解放します。
不要になったインスタンスは削除しないとメモリ圧迫の原因になります。
インスタンスを解放する例を次に示します。
*> Javaのインスタンスを解放する CALL 'CBLJRELEASE' USING CBLJENV OBJREF. |
*> Javaのインスタンスを解放する CALL 'CBLJSETNULL' USING CBLJENV OBJREF. |
CBLJRELEASEサービスルーチンについては,「6.1.2 基本操作」の「(10) CBLJRELEASE」を参照してください。
CBLJSETNULLサービスルーチンについては,「6.1.4 オブジェクト操作」の「(6) CBLJSETNULL」を参照してください。
CBLJFINALIZEサービスルーチンを使ってJavaプログラム呼び出し機能の実行環境を削除します。
Javaの実行環境は多くのシステムリソースを必要としますので,不要になったら削除する必要があります。
Javaプログラム呼び出し機能の実行環境の終了例を次に示します。
*> Javaの実行環境を削除する CALL 'CBLJFINALIZE' USING CBLJENV. |
CBLJFINALIZEサービスルーチンについては,「6.1.2 基本操作」の「(11) CBLJFINALIZE」を参照してください。
All Rights Reserved. Copyright (C) 2014, 2016, Hitachi, Ltd.