Java からの手続き型 COBOL の呼出し

ここでは、com.microfocus.cobol.RuntimeSystem クラスに含まれる COBOL サポートを使用して、Java から手続き型 COBOL のレガシープログラムにアクセスする方法を説明します。

概要

手続き型の COBOL プログラムは、Java プログラムや EJB から呼び出すことができます (COBOL で作成した EJB に限らず、さまざまな言語で作成した EJB から呼出し可能です)。この呼出しに使用できる各種の方法については、『Java と COBOL の連携』の章で概要を示しています。

ここで説明するのは、com.microfocus.cobol.RuntimeSystem クラスと CobolBean クラスに含まれる COBOL サポートを使用して呼出しを行う方法です。CobolBean クラスは、実際には RuntimeSystem クラスの拡張であり、一連の RuntimeSystem.cobcall*() メソッドを使用します。ここで紹介する手法は、オブジェクト COBOL と Enterprise Server を使用しないで、Java や EJB から COBOL プログラムを呼び出すときに使用します。

Java オブジェクトには JNI (java native interface) を介するか、オブジェクト COBOL の Java ドメインを使用してアクセスできます。

com.microfocus.cobol.RuntimeSystem クラスの COBOL サポートは一連の関数から構成されており、COBOL プログラムのロード、呼出し、およびキャンセルを実行できます。また、Java 配列を使用して、COBOL プログラムにパラメータを渡すことも可能です。com.microfocus.cobol.RuntimeSystem クラスの関数群が、配列からデータを取り出し、そのデータを COBOL プログラムに渡します。図 3-1 は、Java プログラムから COBOL プログラムを呼び出し、2 つのパラメータを渡す処理を示しています。

Java からの COBOL プログラムの呼出し

図 3-1: Java からの COBOL プログラムの呼出し

ここで説明する情報を活用するには、Java 言語に関する基本レベル以上の知識が必要になります。Java 言語の基本的な知識を得るには、Micro Focus Links のリンク先にある Sun 社の Java Web サイトが役立ちます。

環境の設定方法は、『Java と COBOL の連携』の章の『Java と COBOL の環境の設定』の節を参照してください。

Java プログラムの作成

Java プログラムは mfcobol.jar ファイル内の RuntimeSystem.class で定義されている関数群を使用して COBOL の入口点を呼び出します。このクラスには cobcall_returntype() という名前の一連の関数が含まれています (returntype の部分は、呼出し対象の COBOL プログラムまたは入口点によって返される値のデータ型によって変化します。たとえば、整数型を返す COBOL プログラムの呼出しには cobcall_int() を使用します)。

Java プログラムで COBOL サポートを使用するには、Java ソースファイルの先頭に次の文を記述してください。

import com.microfocus.cobol.*; 

マルチスレッド関連の留意点

Java ランタイムシステムはマルチスレッド環境であるため、Java から呼び出す COBOL プログラムは、呼出し元の Java プログラムがマルチスレッドプログラムかどうかに関係なく、常にマルチスレッドの COBOL ランタイムシステムとリンクする必要があります。COBOL プログラムをマルチスレッドの Java プログラムから呼び出す場合には、使用中の COBOL データに他のスレッドがアクセスしてデータが壊れてしまわないように対処する必要があります。

この問題には、次の方法で対処できます。

または、CobolBean インターフェイスを使用して、COBOL プログラムの作業場所節を CobolBean クラスの特定インスタンスと関連付ける方法を検討します。

COBOL プログラムやライブラリのロード

COBOL プログラムをライブラリファイルにリンクしている場合や、COBOL プログラム内の入口点を公開する場合には、Java プログラムから COBOL プログラムを呼び出す前に、プログラム自体やライブラリファイルをロードする必要があります。runtime.class の runtime.cobload() メソッドを使用してロードします。たとえば、次のように mycbl 内のプログラムをロードします。

{  
  if (RuntimeSystem.cobload("mycbl") != 0)
     System.out.println("Could not load library\n") ;
  else
     System.out.println("Library loaded successfully\n") ;
}

cobcall() メソッドの使用方法

必要なライブラリやプログラムをロードした後 (詳細は前項を参照)、Java アプリケーションで cobcall_ メソッドを使用して COBOL プログラムを呼び出します。cobcall_ は RuntimeSystem.class に含まれるメソッドで、すべて静的メソッドとして定義されているため、事前に RuntimeSystem.class をインスタンス化する必要はありません。cobcall_ メソッドには 2 つまたは 3 つの引数を指定します (3 番目の引数は省略可能)。

引数の指定方法 1

引数の指定方法 2

パラメータの Java と COBOL 間の変換の詳細は、『Java データ型』の章を参照してください。『Java プログラムの作成』の節で前述したように cobcall_ メソッド関数にはいくつかの種類があり、COBOL プログラムや入口点の戻り値のデータ型に応じて、対応する Java データ型の名前を持つ関数を使用します。たとえば、COBOL プログラムが符号付き整数型 (pic s9(9) comp-5 など) の値を返す場合には、この値は Java のデータ型では int 型に相当するため、この COBOL プログラムの呼出しには cobcall_int メソッドを使用します。デフォルトでは、すべてのパラメータは参照渡しされます。

コピーファイル javatypes.cpy には、Java のデータ型に対応する一連の COBOL データ形式が定義されています。Java プログラムとのパラメータのやり取りに使用する COBOL データ項目は、このファイル内で定義されているデータ形式を使用して宣言することが推奨されます。これらのデータ形式を使用すると、他の COBOL プラットフォームとの互換性を維持できます。

cobcall_ の各メソッドの完全なリストは、 Java Classes for Run-time Support を参照してください。

Java プログラムからの呼出し例

ここでは、Java プログラムから COBOL プログラムを呼び出す 2 つの短いコード例を示します。最初の例は次の処理を実行します。

簡単な COBOL の副プログラム、legacy.cbl を示します。

working-storage section.
copy "javatypes.cpy". 
01 wsResult       jint.

linkage section.
01 wsOperand1     jint.*> この型は javatypes.cpy で定義済み
01 wsOperand2     jint. 
01 wsOperation    pic x.

procedure division using wsOperand1 wsOperand2 wsOperation.
    evaluate wsOperation
    when "a"
        add wsOperand1 to wsOperand2 giving wsResult
    when "s"
        subtract wsOperand1 from wsOperand2 giving wsResult
    end-evaluate
    exit program returning wsResult.

次に、この副プログラムを呼び出す Java プログラムを示します。

import com.microfocus.cobol.* ;
class SimpleCall
{
   public static void main(String argv[]) throws Exception
   {
       int i = RuntimeSystem.cobcall_int("legacy", 
		            	new ParameterList()
		            	.add((int)4
		            	.add((int)7
		            	.add((byte)'a'));
       System.out.println(i) ;
   }
}

2 つ目の例では、複数の異なる USAGE 句に相当する配列を使用して COBOL プログラムへデータを渡す方法を示します。使用されている cobcall() メソッドは値を戻しませんが、最初のパラメータとしてオブジェクトを渡し、COBOL プログラムから同じオブジェクト型を返すことができます。次の SimpleCall2 は、最初のパラメータを参照で、2 番目のパラメータを値で、3 番目のパラメータを内容 (by content) で、それぞれ渡します。

import com.microfocus.cobol.* ;

class SimpleCall2
{
   public static void main(String argv[]) throws Exception
   {
      RuntimeSystem.cobcall(null, "usages", 
                    new ParameterList()
                    .add((int)1, RuntimeSystem.BY_REFERENCE)
                    .add((int)2, RuntimeSystem.BY_VALUE)
                    .add((int)3, RuntimeSystem.BY_CONTENT));
   }
}

Java オブジェクト内のデータメンバの変更

ここでの例は前項の例に似ていますが、COBOL プログラムから返される値を使用して、Java オブジェクト内のデータメンバの 1 つの値を変更しています。

thread-local-storage section.
copy "javatypes.cpy".

linkage section.
01 wsOperand1               jint.
01 wsOperand2               jint.
01 wsOperation              pic x.
01 wsResult                 jint.

procedure division using wsOperand1 wsOperand2 wsOperation
                         wsResult.
    evaluate wsOperation
    when "a"
        add wsOperand1 to wsOperand2
    when "s"
        subtract wsOperand1 from wsOperand2
    end-evaluate
    exit program returning wsResult

この Java クラス SimpleCall2 は、legacy2.cbllegacy2.ext というライブラリファイルに組み込まれていることを前提としています。このサブルーチンが別のライブラリファイルに組み込まれている場合には、legacy2 を呼び出す前に RuntimeSystem.cobload() メソッドを使用して、そのライブラリファイルをロードする必要があります。

import com.microfocus.cobol.* ;
class SimpleCall2
{
   Integer simpleInteger1;
   Integer simpleInteger2;
   Integer simpleResult;
   public SimpleCall2(int a, int b)
   {
      simpleInteger1 = new Integer(a);
      simpleInteger2 = new Integer(b);
      simpleResult   = new Integer(0);
   }
   public String toString()
   {
      return new String(
            "simple1Integer1 = "+simpleInteger1+"\n" +
            "simple1Integer2 = "+simpleInteger2+"\n" +
            "simpleResult    = "+simpleResult);   
   }
   public static void main(String argv[]) throws Exception
   {
      SimpleCall2 firstDemo = new SimpleCall2(4,7);
      Object theParams[] = { firstDemo.simpleInteger1,
                             firstDemo.simpleInteger2,
                             new Byte((byte) 'a'),
                             firstDemo.simpleResult } 
      System.out.println("Before call\n"+firstDemo) ;
      int i = RuntimeSystem.cobcall_int("legacy2",theParams);
      System.out.println("After call\n"+firstDemo) ;
   }
}

インスタンスデータとしての CobolBean の使用

com.microfocus.cobol.CobolBean クラスを使用すると、COBOL プログラムをスレッドセーフになるように書き直したり、Java アプリケーションからパラメータを取り込むように書き直したりすることなく、CobolBean のインスタンスを COBOL プログラムの記憶域節のインスタンスに関連付けることができます。

たとえば、次の COBOL プログラムは、複数の Java クラスから cobcall() で呼び出されると、同じデータを共有します。

$set intlevel"4" data-context
 working-storage section.
 01 address-rec pic x(30). 

 linkage section.
 01 lnk-address-rec pic x(30).

 procedure division.
    goback. 
 entry "setAddressBook" using lnk-address-rec.
    move lnk-address-rec to address-rec
    exit program returning 0.
 entry "getAddressBook" using lnk-address-rec.
    move address-rec to lnk-address-rec
    exit program returning 0.

com.microfocus.cobol.CobolBean を拡張する Java クラスを作成すると、cobcall() のインスタンス (data-context) バージョンを利用できます。CobolBean.cobcall() で呼び出す COBOL プログラムは、RE-ENTRANT(1/2)、SERIAL などのスレッド化指令ではなく、常に DATA-CONTEXT 指令を使用してコンパイルする必要があります。DATA-CONTEXT 指令を指定すると、COBOL ランタイムシステムが CobolBean.cobcall() から使用されるときに、常に新しい COBOL 作業場所節が割り当てられます。

次の例では、COBOL プログラムの共有データ bean1.getAddress() が bean2.getAddress() と等しければ、通常は問題が発生しますが、Java プログラムが CobolBean の cobcall() を使用しているため、COBOL 作業場所節が CobolBean と関連付けられます。

import com.microfocus.cobol.*;
import com.microfocus.cobol.lang.*;  

public class MyBean extends com.microfocus.cobol.CobolBean
{
   private StringBuffer address = new StringBuffer(30);

   public MyBean() throws Exception
   {
     super();
     super.cobload("addbook");
   }

   public String getAddress() throws Exception
   {
     Pointer addressPointer = 
	       new Pointer(this.address.toString(),30);    
     super.cobcall("getAddressBook", 
	       new ParameterList().add(addressPointer));
     this.address.setLength(0);
     this.address.append(addressPointer.toString());
     return address.toString();
   }

   public void setAddress(String address) throws Exception
   {
     super.cobcall("setAddressBook", 
	       new ParameterList().add(new Pointer(address,30)));
   }

   public static void main(String[] args) throws Exception
   {
      MyBean bean1 =new MyBean();
      bean1.setAddress("Mr A");

      MyBean bean2 =new MyBean();
      bean2.setAddress("Mr B");

      System.out.println("bean1.getAddress="+
		                    bean1.getAddress());
      System.out.println("bean2.getAddress="+
		                    bean2.getAddress());
   }
}

COBOL プログラムのキャンセル

メモリリークを防ぐため、Java オブジェクトがガーベッジコレクタによって破棄される前に、Java からロードした COBOL プログラムをすべてキャンセルする必要があります。Java オブジェクトの Finalize メソッドから、次の呼出しを使用します。

RuntimeSystem.cobcancel("program")

program は、RuntimeSystem.cobload() 呼出しでロードされる COBOL プログラムの名前です。次に Java プログラム内の Finalize メソッドの例を示します。

private void Finalize()
{
      try
      {
            RuntimeSystem.cobcancel("demoFinalizers");
            System.out.println("demoFinalizers - 終了");
      }
      catch(Exception e)
      {
            System.out.println(
                "終了中のエラー : "+e.getMessage());
      }
}

警告:

Java プログラムからの文字列操作

Java プログラムから COBOL に文字列を渡すときには、Java の String クラスまたは StringBuffer クラスを使用します。この処理では、次のどれかの手法を使用できます。

Pointer クラス

Java の文字列を COBOL に渡す際に常に問題になるのが文字列長です。COBOL では、文字列は常に固定長になるからです。COBOL プログラムで定義済みの固定長フィールドに変更を加えるには、そのインスタンスを Pointer クラスの新しいインスタンスでラップする必要があります。Pointer クラスは com.microfocus.cobol.lang package で定義されています。

PIC X(20) データ項目を定義している COBOL プログラムの例を次に示します。

showbytes.cbl:
       working-storage section.
       linkage section.
       01 lnk-string     pic x(20).
       procedure division using lnk-string.
          display "lnk-string = " lnk-string.
          move "Hello from COBOL - 1" to lnk-string.
          exit program returning 0.

対応する Java のコードは次のようになります。

showbytes.java:

import com.microfocus.cobol.RuntimeSystem;
import com.microfocus.cobol.lang.Pointer;
import com.microfocus.cobol.lang.ParameterList;

public class showbytes
{
  public static void main(String[] args) throws Exception
  {
   String myString = new String("Hello to COBOL");
   Pointer ptr2String = new Pointer(myString, 20);

   RuntimeSystem.cobcall("showbytes", 
	         new ParameterList().add(ptr2String));
		   	
   myString = ptr2String.toString();

   System.out.println(myString = ["+myString+"]");
  }  
}

mfjstring

COBOL プログラムでは Java から渡された文字列を変更することはできませんが、StringBuffer の内容は変更可能です。文字列操作を容易にするため、javatypes.cpy で MF-JSTRING 型が定義されています。定義の内容は次のとおりです。

01 mf-jstring is typedef.
    03 len                  jint.
    03 capacity             jint.
    03 ptr2string           pointer.

len フィールドは文字列の長さ、capacity フィールドはバッファのサイズをそれぞれ指定します。String の場合には、capacity フィールドの値は常に 0 です。ptr2tring フィールドは、実際の文字列の先頭アドレスへのポインタです。StringBuffer の場合は、既存のバッファを変更できるほか、新しいバッファを割り当てて、その先頭アドレスを指すように ptr2string を指定できます。

次の COBOL プログラムは、Java から渡された String と StringBuffer を連結し、結果を StringBuffer に格納して返します。

 program-id. StringAdd.  
 thread-local-storage section.
 copy "javatypes.cpy".
 01 lsNewPtr                 pointer.
 01 lsSize         jint. *> この型は javatypes.cpy で定義済み
 01 i              jint.
 01 lsStatus       jint.
 01 lsBigBuffer              pic x(1024).
 linkage section.
 01 lnkJString               mf-jstring.
 01 lnkJStringBuffer         mf-jstring.
 01 lnkString                pic x(256).
 01 lnkStringbuffer          pic x(256).
 procedure division using lnkJString lnkJStringBuffer.
     set address of lnkStringBuffer to
                              ptr2string of lnkJStringBuffer
     set address of lnkString to ptr2string of lnkJString
*> lnkJStringBuffer が Java StringBuffer であることを確認します。
     if capacity of lnkJStringBuffer > 0
         add len of lnkJString to len of lnkJStringBuffer
                                   giving lsSize
*> 連結バッファがオーバーフローしないことを確認します。
         if lsSize < 1024
             move len of lnkJString to i
             move lnkString(1:i) to lsBigBuffer
             add 1 to i
             move lnkStringBuffer to lsBigBuffer(i:lsSize)
             set ptr2string of lnkJStringBuffer
                                 to address of lsBigBuffer
             move lsSize to len of lnkJStringBuffer
         end-if
     end-if

次の Java クラス StringsToCobol は、文字列 "fred" および "ginger" を StringAdd に渡し、結果を表示します。

import mfcobol.*;
public class StringsToCobol {
  public static void main(String[] args) throws Exception
  {
      StringBuffer sb1 = new StringBuffer("ginger") ;
      Object theParams[] = {"fred" ,
                             sb1} ;
      RuntimeSystem.cobcall_int("stringadd", theParams) ;
      System.out.println(sb1) ;
  }
}

CobolNational クラス

CobolNational Java クラスを使用すると、UTF-16 文字列を生成して COBOL の PIC N(...) usage is national フィールドに渡すことができます。

たとえば、次の COBOL プログラム (hellonat) は文字列 "Hello From Java" を受け取り、PIC N(40) USAGE IS NATIONAL として定義したデータ項目に格納します。

 $set unicode(portable)
  working-storage section.
  linkage section.
  01 lnk-natstring   pic n(40) usage is national.
  procedure division using lnk-natstring.
      display "Java から COBOL に渡ってきた文字列 [" lnk-natstring "]"
      move "Hello From Java" to lnk-natstring
      exit program returning 0.

文字列 "Hello From Java" を COBOL プログラム hellonat に渡す Java コードは次のとおりです。

CobolNational cobnat = 
	             new CobolNational("Hello From Java", 40);
RuntimeSystem.cobcall("hellonat", 
              new ParameterList().add(cobnat));
System.out.println(cobnat.toString());

カスタムレコードによって集団項目を渡す方法

com.microfocus.cobol.lang で定義されている CustomRecord インターフェイスを使用すると、cobCall() や cobrcall() で呼び出したレガシー COBOL プログラムに集団項目を渡すことができます。

CustomRecord インターフェイスの定義を次に示します。

package com.microfocus.cobol.lang;  
public interface CustomRecord  
{  
  public Object[] getParameters();  
  public void setParameters(Object[] parms);  
}

$COBDIR/demo/java/cobol/RecordDemo では、データ項目 customerDetails が次のように定義されています。

  
  01 customerDetails.  
         03 customerName       pic x(30).  
         03 customerAddress    pic x(30).  
         03 customerRef        pic 9(6).

Java による CustomRecord インターフェイスの実装例を次に示します。

import com.microfocus.cobol.lang.*;  
import java.text.*; 

public class RecordData implements 
             com.microfocus.cobol.lang.CustomRecord  
{  
    private String customerName;  
    private StringBuffer customerAddress;  
    private int customerRef;
    RecordData(String name, String address, int ref)  
    {  
      customerName = name;  
      customerAddress = new StringBuffer(address);  
      customerRef = ref;  
    }
    public String getCustomerName()  
    {  
      return this.customerName;  
    }
    public String getCustomerAddress()  
    {  
      return this.customerAddress.toString();  
    }
    public int getCustomerRef()  
    {  
      return this.customerRef;  
    }
    public Object[] getParameters()
    {  
      String strCustomerRef = 
		          Integer.toString(this.customerRef);    	  
      while(strCustomerRef.length() <  6)  
      {  
         strCustomerRef = "0"+strCustomerRef;  
      }
      customerAddress.setLength(30);       
		          /* 必ず正しい長さを指定してください。 */  
      customerAddress.ensureCapacity(30);
      return new ParameterList()  
        .add(new Pointer(this.customerName,30))  
        .add(this.customerAddress)  
        .add(strCustomerRef.getBytes())  
        .getArguments();  
    }
    public void setParameters(Object[] parms)  
    {  
      Pointer ptr = (Pointer)parms[0];  
      this.customerName = ptr.toString();   
      this.customerAddress = (StringBuffer)parms[1];  
      byte[] byteCustomerRef = (byte[])parms[2];  
      this.customerRef = 
		      Integer.parseInt(new String(byteCustomerRef));  
    }
    public String toString()  
    {  
      return "Customer Name : "+this.customerName+"\n"+  
          "Customer Address : "+this.customerAddress+"\n"+  
          "Customer Ref     : "+this.customerRef;  
    }  
}

Java プログラム内では、次のようなコードで COBOL プログラムを呼び出します。

cobcall("RecordDemo",new ParameterList().add(
              new RecordData(myname, myaddress, myref)));

Java データ型』の章の『ParameterList() によるパラメータの追加』の節も参照してください。

COBOL での JNI の使用

JNI は、Java のオブジェクトとクラスを、Java 以外の言語で作成したプログラムで利用するためのインターフェイスです。com.microfocus.cobol.RuntimeSystem クラス内の cobcall() メソッドを使用して、呼出し対象の COBOL プログラムに JNI ポインタを渡します。JNI ポインタとは、Java 以外のコードから Java ランタイムシステムへのアクセスを可能にする Java 関数群のテーブルを指すポインタです。

COBOL で JNI を容易に利用できるようにするため、javatypes.cpy でデータ型 JNINativeInterface が定義されています。JNINativeInterface は、JNI Java 関数群を指す一連の手続きポインタで構成される集団項目です。COBOL での JNI の用途としては、COBOL プログラムからの Java 例外のスローなどがあります。

COBOL プログラムから Java にアクセスする手段としては、ドメインサポートも使用できます (『オブジェクト COBOL からの Java の呼出し』の章を参照)。

例外スローの例

JNI の関数を使用して例外をスローする COBOL プログラムの例を次に示します。

 identification division.
 program-id.  "except".
 special-names.

**********************************************
* JNI 呼出しに使用する呼出し規約をここで
* 指定します。Win32 システムの場合は 74 を
* 指定します (stdcall の呼出し規約に対応
* しています)。
**********************************************
$if UNIX defined
     call-convention 0 is javaapi.
$else
     call-convention 74 is javaapi.
$end
 local-storage section.
 copy "javatypes.cpy".
 01 JavaException               pointer.
 01 ExceptionClass              pointer.
 linkage section.
 01 JEnv                        pointer.
 01 jobject                     pointer.
 01 lnk-JNINativeInterface      JNINativeInterface.
* 最初のパラメータ (JEnv) は、JNI 関数テーブルへのポインタ
* です。JNI 関数呼出しでは常に、このポインタを最初の
* パラメータとして参照渡しする必要があります。
 procedure division
      using by reference JEnv.
* JEnv で渡されたポインタを JNINativeInterface
* 構造体の先頭アドレスにマップして、JNI 関数
* の呼出しを可能にします。
     set address of lnk-JNINativeInterface to JEnv
* 例外クラスへの参照を取得します。
      call javaapi FindClass
             using by reference JEnv
                   by reference
                   z"java/lang/IllegalArgumentException"
             returning ExceptionClass
      end-call
* 例外クラスが見つからない場合は、そのまま終了します。
     if ExceptionClass = NULL
             exit program
     end-if
* 新しい例外をスローします。
     call javaapi ThrowNew
             using by reference JEnv
                   by value ExceptionClass
                   by reference z"Thrown from COBOL code"
     end-call
     exit program
     .

次に呼出し側の Java プログラムを示します。

import com.microfocus.cobol.*;
class testexcept
{
  public static void main(String argv[]) throws Exception
  {
    try
    {  
       /* JNIEnv で渡すため、最後の引数は true に設定します。 */
       RuntimeSystem.cobcall(null,"throwex",null,null,true);
    }
    catch(Exception e)
    {
       System.out.println(
                  "PASS - 例外キャッチ ("+ e + ")"); 
    }
  }
}

サンプルプログラム

本 COBOL 開発システムには、Java からの手続き型 COBOL 呼出しのさまざまな側面を示すサンプルプログラムが付属しています。サンプルプログラムは、製品のインストール先の $COBDIR/demo/java/cobol/ ディレクトリにあります。これらのディレクトリ内の各ファイルは、いずれもサンプル関連ファイルであり、readme.txt ファイルに詳細情報が記載されています。

サンプルプログラムを格納している各ディレクトリと、格納されているサンプルの機能の概要を次に示します。

ディレクトリ名 概要
arrays COBOL で Java 配列を読み取ります。COBOL で Java 配列を更新します。
pi pi を計算します。数値を文字列として Java に返します。
primtypes Java の原始データ型を COBOL に渡します。Java の原始データ型を COBOL で更新します。
record 簡単な COBOL Java オブジェクトを作成します。DataType インターフェイスを実装する Java オブジェクト から COBOL プログラムにデータを渡し、構造体に格納します。パラメータを参照で (BY REFERENCE) 渡します。