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. *> type defined in 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 *> Check that lnkJStringBuffer is a Java StringBuffer if capacity of lnkJStringBuffer > 0 add len of lnkJString to len of lnkJStringBuffer giving lsSize *> Check we don't overflow concatenation buffer 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) ; } }