From: William S F. <ws...@fu...> - 2008-01-25 22:04:15
|
Kevin Mills wrote: > Dear List: > > I can't seem to get JAVA_ARRAYSOFCLASSES() to do what I expect. Here is > a simple test I constructed: > > array.i: > > %module array_test > %include <arrays_java.i> > %{ > typedef struct > { > int x, y, z; > } Test; > %} > > JAVA_ARRAYSOFCLASSES(Test) > > typedef struct > { > int x, y, z; > } Test; > > %apply Test[] { Test * structArray } > > extern void afunction(Test * structArray); > > The generated code looks fine - the C wrapper pulls arguments out of the > Java array and puts them back into the array after the call to > "afunction". In the debugger I can see the values I expect. However, > I'm not seeing changes to the structs come through on the Java side. > > In my Java code I do the following: > > Test.java: > > public static void main( String[] args ) > { > Test[] testArray = new one[2]; > testArray[0] = new Test(); > testArray[1] = new Test(); > > testArray[0].setX(3); > testArray[0].setY(3); > testArray[0].setZ(3); > testArray[1].setX(3); > testArray[1].setY(3); > testArray[1].setZ(3); > > array_test.afunction(testArray); > > System.out.println(testArray[0].getX()); > System.out.println(testArray[0].getY()); > System.out.println(testArray[0].getZ()); > System.out.println(testArray[1].getX()); > System.out.println(testArray[1].getY()); > System.out.println(testArray[1].getZ()); > } > > In my C code I do this: > > Test.c: > > void afunction(one * structArray) > { > structArray[0].x = 1; > structArray[0].y = 1; > structArray[0].z = 1; > structArray[1].x = 2; > structArray[1].y = 2; > structArray[1].z = 2; > } > > I would expect the final System.out.println() statements in the Java > code to show me the values that I set within the C code. However they > show the same values I set initially. Am I missing something? > This is a bug in the argout typemap which I've just committed to svn. The elements were not being copied back into the original array elements. Either use the svn version or add this after the %include <arrays_java.i>: %typemap(argout) Test[ANY], Test[] { int i; for (i=0; i<sz$argnum; i++) { **($&1_ltype)&jarr$argnum[i] = $1[i]; } JCALL3(ReleaseLongArrayElements, jenv, $input, jarr$argnum, 0); } William |