COBOL2002 Javaプログラム呼び出し機能ガイド


6.1.1 サービスルーチンで使用する引数

ここでは,Javaプログラム呼び出し機能のサービスルーチンで使用する引数について説明します。

〈この項の構成〉

(1) CBLJENV集団項目

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のドキュメントを参照してください。

Java VM起動オプションの例1

オプション文字列:-Dプロパティ名=値

説明:システムプロパティを設定します。

-Djava.compiler=NONE     …JITの無効化設定
-Djava.class.path=パス   …クラスのパス設定
-Djava.library.path=パス …ライブラリのパス設定
Java VM起動オプションの例2

オプション文字列:-verbose:{gc|class|jni}

説明:指定メッセージ種別の詳細メッセージ出力を有効にします。

gc:ガーベジコレクション関連メッセージ

class:クラスロード関連メッセージ

jni:JNI関連メッセージ

注意事項

CBLJENV集団項目の初期値は,CBLJINITIALIZEサービスルーチンが明示的または暗黙的に呼び出される前に設定してください。CBLJINITIALIZEサービスルーチンが呼び出されたあとで変更しないでください。

(2) 名前型集団項目

Javaのクラス名,メソッド名,およびフィールド名を引数として渡す場合に,動的長基本項目の代わりに名前型集団項目を使用できます。名前型集団項目は,最後の領域がNULL終端文字となるLOW-VALUEとなるように定義します。

名前型集団項目の例を次に示します。

       01  名前.
         02  NAMESTR  PIC X(16) VALUE '名前の文字列'.                   *> ※1
         02  FILLER   PIC X     VALUE LOW-VALUE.                        *> ※2
注※1

項目の名前はNAMESTR以外を設定できます。参照しない場合は,FILLERを設定できます。

注※2

NULL終端文字を示します。

名前の文字列にパッケージ付きのクラス名やインタフェース名を記述する場合は,ピリオドの代わりにスラントを使って区切ります。

例)
java/lang/String

NAMESTR項目のサイズは,名前の文字列のサイズより大きく宣言してもよく,名前のあとに連続する空白文字が挿入されていてもかまいません。ただし,Javaプログラム呼び出し機能のサービスルーチンに渡した場合,末尾の連続する空白文字はLOW-VALUE文字に置き換えられます。

(3) パラメタ型集団項目

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
注※1

DATA-TYPE項目には,Javaの型を表す文字列(シグニチャ)を指定します。

基本データ型の場合は,1文字の英数字項目を指定します。

オブジェクト系の型の場合は,CBLJENV集団項目のCBLJSTRMAXLENに指定したサイズの英数字項目を指定します。CBLJENV集団項目のCBLJSTRMAXLENに指定したサイズ以外で定義すると,アクセス違反などの不正な動作となります。

注※2

この値は必ずLOW-VALUEとなるように定義してください。

注※3

DATA-AREA項目には,Javaの型に対応するCOBOLのデータ項目を指定します。

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

注※1

1バイト2進機能(-Bin1Byteコンパイラオプションを指定)を使用する場合です。

注※2

1バイト2進機能を使用する場合,対応するCOBOLの数字項目のけた数の範囲がこの表で示す値と異なる個所があります。1バイト2進機能については,マニュアル「COBOL2002 言語 拡張仕様編」を参照してください。

COBOLプログラムでのパラメタ型集団項目の記述例を次に示します。

(例1)int型の場合
   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.
(例2)String型のオブジェクトの場合
   01 ARG.
      02  DATA-TYPE   PIC X(256) VALUE 'Ljava/lang/String;'.
      02  DATA-AREA   USAGE POINTER.
(例3)String型の配列オブジェクトの場合
   01 ARG.
      02  DATA-TYPE   PIC X(256) VALUE '[Ljava/lang/String;'.
      02  DATA-AREA   USAGE POINTER.

基本データ型では,DATA-AREA項目のデータ型を判定しないで,Javaの型に対応するバイナリデータをそのまま受け渡します。対応するCOBOLのデータ型は,その用途によって適切な型を選択してください。

(4) 引数リスト型集団項目

Javaのメソッドを呼び出す場合は,メソッドに渡す引数を引数リスト型集団項目で指定します。

引数リスト型集団項目は,パラメタ型集団項目を示すポインタ項目の繰り返し項目です。

終端の要素にはNULL値を設定する必要があります。このため,実際の引数の個数+1以上の繰り返し要素数を記述してください。

引数リスト型集団項目の例を次に示します。

引数なしのメソッドを呼び出す場合
      *>
      *> 引数リスト型(引数なし)の宣言
      *>
       01 NO-ARG.
          02 FILLER         USAGE POINTER VALUE NULL.
 
           CALL 'CBLJSTATICINVOKE'
               USING CBLJENV CLSREF sample NO-ARG RTN-1.
引数の個数が3のメソッドを呼び出す場合
      *>
      *> 引数リスト型(引数の個数が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.