COBOL2002 Javaプログラム呼び出し機能ガイド
ここでは,Javaプログラム呼び出し機能のサービスルーチンで使用する引数について説明します。
Javaプログラム呼び出し機能のサービスルーチンの第1引数には,CBLJENV集団項目を指定します。
CBLJENV集団項目は,スレッドごとに一つの領域を確保する必要があります。また,一つのJavaプログラム呼び出し機能の実行単位(CBLJINITIALIZEサービスルーチンで初期化してからCBLJFINALIZEサービスルーチンで終了するまでの間)に,複数のCBLJENV集団項目を使用することはできません。
CBLJENV集団項目は,作業場所節に01レベルの集団項目として記述してください。
CBLJENV集団項目を次に示します。
01 CBLJENV.
02 CBLJENVCORE USAGE POINTER VALUE NULL. *> JNI/Java VM情報
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 m. *> 引数で使う文字列長
02 CBLJVMOPTIONS. *> Java VM起動オプション
03 CBLJOPTCOUNT PIC S9(9) USAGE COMP VALUE n. *> オプション数
03 CBLJOPTION-1 PIC X(m) VALUE 'オプション文字列'.
03 CBLJOPTION-2 PIC X(m) VALUE 'オプション文字列'.
:
03 CBLJOPTION-n PIC X(m) VALUE 'オプション文字列'.
|
複数のプログラムで一つの実行単位を構成する場合にも,一つのCBLJENV集団項目を使用する必要があります。あるプログラムの作業場所節でCBLJENV集団項目を定義し,ほかのプログラムでは参照渡し(BY REFERENCE)の引数として受け渡したCBLJENV集団項目を使用します。
複数のプログラムで一つのCBLJENV集団項目を使用する場合を次に示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CBLJENV.
02 CBLJENVCORE USAGE POINTER VALUE NULL.
:
PROCEDURE DIVISION.
CALL 'SUB1' USING CBLJENV.
:
IDENTIFICATION DIVISION.
PROGRAM
PROGRAM-ID. SUB1.
DATA DIVISION.
LINKAGE SECTION.
01 CBLJENV.
02 CBLJENVCORE USAGE POINTER.
:
PROCEDURE DIVISION USING CBLJENV.
CALL 'CBLJGETCLASS' USING CBLJENV SampleClass CLASSREF.
|
CBLJENV集団項目の内容を次の表に示します。
表6-2 CBLJENV集団項目の内容
| 項番 | 項目名 | 設定値 |
|---|---|---|
| 1 | CBLJENVCORE | CBLJINITIALIZEサービスルーチンで作成されたJavaの実行環境(JNIおよびJava VM)の管理情報が格納されます。 必ずNULLで初期化してください。 |
| 2 | CBLJEXCEPTION | Javaのコンストラクタやメソッドの呼び出しでスローされた例外オブジェクトが格納されます。 必ずNULLで初期化してください。 |
| 3 | CBLJFLAGS | Javaプログラム呼び出し機能の初期化時オプションが格納されます。 必ずALL B'0'で初期化してください。 |
| 4 | CBLJSTRMAXLEN | サービスルーチンへの引数で使う英数字項目または日本語項目の最大のサイズ(バイト数)を指定します。1〜1,024の範囲で指定します。 |
| 5 | CBLJVMOPTIONS | Java VMの起動オプションを英数字項目で指定します。 項目のサイズはCBLJSTRMAXLENに指定した値です。 なお,オプション文字列の値の先頭および末尾の連続した半角空白は無視されます。 また,ほかのスレッドでJava VMがすでに起動されている場合,ここで指定したオプションは適用されません。 |
CBLJVMOPTIONSのCBLJOPTION-(1〜n)項目に指定できるオプションの例を次に示します。指定するプロパティ名や値などについては,使用するJava VMのドキュメントを参照してください。
-Djava.compiler=NONE …JITの無効化設定 -Djava.class.path=パス …クラスのパス設定 -Djava.library.path=パス …ライブラリのパス設定 |
Javaのクラス名,メソッド名,およびフィールド名を引数として渡す場合に,動的長基本項目の代わりに名前型集団項目を使用できます。名前型集団項目は,最後の領域がNULL終端文字となるLOW-VALUEとなるように定義します。
名前型集団項目の例を次に示します。
01 名前.
02 NAMESTR PIC X(16) VALUE '名前の文字列'. *> ※1
02 FILLER PIC X VALUE LOW-VALUE. *> ※2
|
名前の文字列にパッケージ付きのクラス名やインタフェース名を記述する場合は,ピリオドの代わりにスラントを使って区切ります。
java/lang/String
NAMESTR項目のサイズは,名前の文字列のサイズより大きく宣言してもよく,名前のあとに連続する空白文字が挿入されていてもかまいません。ただし,Javaプログラム呼び出し機能のサービスルーチンに渡した場合,末尾の連続する空白文字はLOW-VALUE文字に置き換えられます。
Javaのメソッドやフィールドとデータの受け渡しをするデータ項目は次のように記述されている必要があります。
01 データ項目名.
02 DATA-TYPE PIC X. *> ※1
02 FILLER PIC X(7) VALUE ALL LOW-VALUE. *> ※2
02 DATA-AREA 受け渡し領域のデータ項目のデータ記述項. *> ※3
|
01 データ項目名.
02 DATA-TYPE PIC X(m). *> ※1
02 DATA-AREA 受け渡し領域のデータ項目のデータ記述項. *> ※3
|
Javaの型,Javaの型を表す文字列(シグニチャ),Javaの型に対応するCOBOLのデータ項目の関係を次の表に示します。
表6-3 Javaの型と対応するCOBOLの型
| 項番 | Javaの型 | Javaの型を表す文字列(シグニチャ) | Javaの型に対応するCOBOLの型 | |
|---|---|---|---|---|
| 1 | void | V | 該当しない(DATA-TYPE項目の宣言だけでよい) | |
| 2 | byte | B | 英数字項目(1けた) | PIC X |
| 符号付き2進項目(1バイト)※1 | PIC S9(1) USAGE COMP 〜 PIC S9(2) USAGE COMP |
|||
| 3 | char | C | 日本語項目(1けた) | PIC N |
| 符号なし2進項目(2バイト)※2 | PIC 9(1) USAGE COMP 〜 PIC 9(4) USAGE COMP PIC 9(3) USAGE COMP-X 〜 PIC 9(4) USAGE COMP-X |
|||
| 4 | short | S | 符号付き2進項目(2バイト)※2 | PIC S9(1) USAGE COMP 〜 PIC S9(4) USAGE COMP |
| 5 | int | I | 符号付き2進項目(4バイト) | PIC S9(5) USAGE COMP 〜 PIC S9(9) USAGE COMP |
| 6 | long | J | 符号付き2進項目(8バイト) | PIC S9(10) USAGE COMP 〜 PIC S9(18) USAGE COMP |
| 7 | float | F | 単精度内部浮動小数点項目 | USAGE COMP-1 |
| 8 | double | D | 倍精度内部浮動小数点項目 | USAGE COMP-2 |
| 9 | boolean | Z | 英数字項目(1けた) | PIC X |
| 符号なし2進項目(1バイト) | PIC 9(1) USAGE COMP-X 〜 PIC 9(2) USAGE COMP-X |
|||
| 10 | クラスオブジェクト | Tクラス完全修飾名; | ポインタ項目 | USAGE POINTER |
| 11 | オブジェクト | Lクラス完全修飾名; | ポインタ項目 | USAGE POINTER |
| 12 | 配列オブジェクト | [要素の型の文字列 | ポインタ項目 | USAGE POINTER |
COBOLプログラムでのパラメタ型集団項目の記述例を次に示します。
01 ARG.
02 DATA-TYPE PIC X(1) VALUE 'I'.
02 FILLER PIC X(7) VALUE ALL LOW-VALUE.
02 DATA-AREA PIC S9(9) USAGE COMP.
|
01 ARG.
02 DATA-TYPE PIC X(256) VALUE 'Ljava/lang/String;'.
02 DATA-AREA USAGE POINTER.
|
01 ARG.
02 DATA-TYPE PIC X(256) VALUE '[Ljava/lang/String;'.
02 DATA-AREA USAGE POINTER.
|
基本データ型では,DATA-AREA項目のデータ型を判定しないで,Javaの型に対応するバイナリデータをそのまま受け渡します。対応するCOBOLのデータ型は,その用途によって適切な型を選択してください。
表6-4 boolean型と英数字項目の値
| booleanの値 | 英数字項目の値 |
|---|---|
| true | X'01' |
| false | X'00' |
Javaのメソッドを呼び出す場合は,メソッドに渡す引数を引数リスト型集団項目で指定します。
引数リスト型集団項目は,パラメタ型集団項目を示すポインタ項目の繰り返し項目です。
終端の要素にはNULL値を設定する必要があります。このため,実際の引数の個数+1以上の繰り返し要素数を記述してください。
引数リスト型集団項目の例を次に示します。
*>
*> 引数リスト型(引数なし)の宣言
*>
01 NO-ARG.
02 FILLER USAGE POINTER VALUE NULL.
CALL 'CBLJSTATICINVOKE'
USING CBLJENV CLSREF sample NO-ARG RTN-1.
|
*>
*> 引数リスト型(引数の個数が3)の宣言
*>
01 ARG-LIST.
02 ARGPTR USAGE POINTER OCCURS 4 TIMES. *> 個数+1
*>
*> 引数の宣言
*>
01 ARG-1.
02 DATA-TYPE-1 PIC X(1) VALUE 'I'.
02 FILLER PIC X(7) VALUE ALL LOW-VALUE.
02 DATA-AREA-1 PIC S9(9) USAGE COMP.
01 ARG-2.
02 DATA-TYPE-2 PIC X(256) VALUE 'LString;'.
02 DATA-AREA-2 USAGE POINTER.
01 ARG-3.
02 DATA-TYPE-3 PIC X(1) VALUE 'Z'.
02 FILLER PIC X(7) VALUE ALL LOW-VALUE.
02 DATA-AREA-3 PIC X.
COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-1 ).
COMPUTE ARGPTR(2) = FUNCTION ADDR( ARG-2 ).
COMPUTE ARGPTR(3) = FUNCTION ADDR( ARG-3 ).
COMPUTE ARGPTR(4) = ZERO. *> 引数リスト型の終端
CALL 'CBLJSTATICINVOKE'
USING CBLJENV CLSREF sample ARG-LIST RTN-1.
|
All Rights Reserved. Copyright (C) 2014, 2016, Hitachi, Ltd.