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


3.2.1 Javaクラス操作のコーディング

ここでは,次に示すJavaプログラムを操作するCOBOLプログラムについて説明します。

Javaプログラムのソースファイル例
public class SampleClass {
   public static String SampleStaticField;
   public           int SampleField;
   public static   void SampleStaticMethod( int a, double b ) { ... }
   public           int SampleMethod( String a ) { ... }
}
COBOLプログラムのソースファイル例
       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.
〈この項の構成〉

(1) パラメタ領域の定義

Javaプログラム呼び出し機能のサービスルーチンを使用するには,受け渡しで使用するパラメタ領域を定義する必要があります。

(a) CBLJENV集団項目

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'.
(凡例)

-Djava.class.path:.classファイルの検索パスをソースプログラム中で指定する場合のオプションです。

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

CBLJENV集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(1) CBLJENV集団項目」を参照してください。

パラメタ型集団項目については,「6.1.1 サービスルーチンで使用する引数」の「(3) パラメタ型集団項目」を参照してください。

(b) クラス名,フィールド名,およびメソッド名

使用する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) 名前型集団項目」を参照してください。

注意事項

LIMIT句を指定しない動的長基本項目は,プログラム中で値を変更できません。

一つのデータ項目に対して,プログラム中で名称を転記して使用したい場合には,LIMIT句を指定した動的長基本項目か,名前型集団項目を定義して使用します。このとき,データ項目は使用する名称の最大長で定義する必要があります。

LIMIT句を指定した動的長基本項目を使用する場合
    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.

(c) 引数リストおよびパラメタ領域

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) パラメタ型集団項目」を参照してください。

注意事項
  • 引数の最大個数は16個です。

  • オブジェクト型を扱うARG-STR-TYPEやRTN-STR-TYPEの英数字項目のけた数は,CBLJENV集団項目のCBLJSTRMAXLEN項目に指定した値と同じにしてください。

(2) Javaプログラム呼び出し機能の初期化

CBLJINITIALIZEサービスルーチンを呼び出して,Javaプログラム呼び出し機能を初期化します。

CBLJINITIALIZEサービスルーチンを呼び出す例を次に示します。

           CALL 'CBLJINITIALIZE' USING CBLJENV.

この例では,最初のCBLJGETCLASSサービスルーチンの呼び出し時に,このサービスルーチンが自動で呼び出されるため,明示的に呼び出していません。

CBLJINITIALIZEサービスルーチンについては,「6.1.2 基本操作」の「(1) CBLJINITIALIZE」を参照してください。

(3) クラス参照の取得

CBLJGETCLASSサービスルーチンを呼び出して,使用するJavaクラスを初期化し,クラス参照を取得します。

CBLJGETCLASSサービスルーチンを呼び出して,JavaのSampleClassクラスのクラス参照を取得する例を次に示します。

      *> JavaのSampleClassクラスのクラス参照を取得する
       
           CALL 'CBLJGETCLASS' USING CBLJENV SampleClass CLASSREF.

取得したクラス参照は次の操作で使用します。

CBLJGETCLASSサービスルーチンについては,「6.1.2 基本操作」の「(2) CBLJGETCLASS」を参照してください。

(4) クラスフィールドのアクセス

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」を参照してください。

(5) クラスメソッドの呼び出し

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.
注意事項
  • 引数なしのメソッドを呼び出す場合も引数なし用の引数リスト(NO-ARG)が必要です。

  • void型メソッドを呼び出す場合もvoid型用パラメタ型集団項目(RTN-VOID)が必要です。

CBLJSTATICINVOKEサービスルーチンについては,「6.1.2 基本操作」の「(5) CBLJSTATICINVOKE」を参照してください。

(6) インスタンスの生成

CBLJNEWサービスルーチンを呼び出して,クラス参照を使ってコンストラクタでクラスインスタンスを生成し,オブジェクト参照を取得します。

コンストラクタの引数には引数リストを指定します。

インスタンスを生成する例を次に示します。

      *> Javaのインスタンスを生成する
       
           CALL 'CBLJNEW' USING CBLJENV CLASSREF NO-ARG  OBJREF.
注意事項

引数なしコンストラクタを呼び出す場合も引数なし用の引数リスト(NO-ARG)が必要です。

CBLJNEWサービスルーチンについては,「6.1.2 基本操作」の「(6) CBLJNEW」を参照してください。

(7) インスタンスフィールドのアクセス

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」を参照してください。

(8) インスタンスメソッドの呼び出し

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.
注意事項
  • 引数なしのメソッドを呼び出す場合も引数なし用の引数リスト(NO-ARG)が必要です。

  • void型メソッドを呼び出す場合もvoid型用パラメタ型集団項目(RTN-VOID)が必要です。

CBLJINVOKEサービスルーチンについては,「6.1.2 基本操作」の「(9) CBLJINVOKE」を参照してください。

(9) インスタンスの解放

CBLJRELEASEサービスルーチンまたはCBLJSETNULLサービスルーチンを使ってインスタンスを解放します。

不要になったインスタンスは削除しないとメモリ圧迫の原因になります。

インスタンスを解放する例を次に示します。

例1)
      *> Javaのインスタンスを解放する
       
           CALL 'CBLJRELEASE'  USING CBLJENV OBJREF.
例2)
      *> Javaのインスタンスを解放する
 
           CALL 'CBLJSETNULL'  USING CBLJENV OBJREF.

CBLJRELEASEサービスルーチンについては,「6.1.2 基本操作」の「(10) CBLJRELEASE」を参照してください。

CBLJSETNULLサービスルーチンについては,「6.1.4 オブジェクト操作」の「(6) CBLJSETNULL」を参照してください。

(10) Javaプログラム呼び出し機能の実行環境の終了処理

CBLJFINALIZEサービスルーチンを使ってJavaプログラム呼び出し機能の実行環境を削除します。

Javaの実行環境は多くのシステムリソースを必要としますので,不要になったら削除する必要があります。

Javaプログラム呼び出し機能の実行環境の終了例を次に示します。

      *> Javaの実行環境を削除する
       
           CALL 'CBLJFINALIZE' USING CBLJENV.

CBLJFINALIZEサービスルーチンについては,「6.1.2 基本操作」の「(11) CBLJFINALIZE」を参照してください。