<cfscript>
// cfSearching: create a 3 x 20 byte array
byteClass = createObject("java", "java.lang.Byte").TYPE;
reflectArray = createObject("java","java.lang.reflect.Array");
arr1 = reflectArray.newInstance(byteClass, javacast("int", 20));
arr2 = reflectArray.newInstance(byteClass, javacast("int", 20));
arr3 = reflectArray.newInstance(byteClass, javacast("int", 20));
multiArray = arrayNew(1);
arrayAppend(multiArray, arr1);
arrayAppend(multiArray, arr2);
arrayAppend(multiArray, arr3);
// cfSearching: pass the array to the java object
myJavaObject.grabBytes(multiArray);
</cfscript>
This struck me as bit awkward, so I reviewed the API and realized there is a simpler way. The java.lang.reflect.Array class contains a second newInstance() method which accepts an int[] array of dimensions. So my final code was reduced to:
<cfscript>
byteClass = createObject("java", "java.lang.Byte").TYPE;
reflectArray = createObject("java","java.lang.reflect.Array");
arrayDimensions = listToArray("3,20");
multiArray = reflectArray.newInstance(byteClass, arrayDimensions);
myJavaObject.grabBytes(multiArray);
</cfscript>
I just thought I would post this tip in case it helps someone.
I'm trying to do something similar to this, except with a multidimensional integer array.
ReplyDeleteI can see how your code works on the coldfusion side of things but what type did you use for the parameter in your grabBytes()java method?
Thanks in advance,
Odhran.
@Odhran,
ReplyDeleteWith a 3-d array it was probably something like:
public static void someMethod(byte[][][] arr) {
...
}
Same concept for a 3-d int array:
public static void someMethod(int[][][] arr) {
...
}
-Leigh