A COBOL program cannot modify the contents of a String passed to it, but it can change a StringBuffer. To make handling strings easier, javatypes.cpy defines the type MF-JSTRING. This data type has the following structure:
01 mf-jstring is typedef. 03 len jint. 03 capacity jint. 03 ptr2string pointer.
The len field defines the length of the string. The capacity field defines the size of the buffer - this field is always 0 for a String. The ptr2string field is a pointer to the start of the actual string. In the case of a StringBuffer, you can either modify the existing buffer, or allocate a new one and set ptr2string to the start of the new buffer.
The COBOL program below concatenates a String and StringBuffer from Java, and returns the result in the 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
The Java class StringsToCobol passes "fred" and "ginger" to StringAdd and then displays the result.
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) ; } }