From: William S F. <ws...@fu...> - 2010-07-01 06:38:51
|
Sylvestre Ledru wrote: > Hello, > > I am trying to map in Java the following line: > int putDouble(char * variableName, double variable[], int nbRow, int > nbCol); > to > public final static native int putDouble(String jarg1, double[][] > jarg2); > > I have been able to manage the input arguments but I am stuck by a line > added by SWIG. > After the native call on putDouble, SWIG is adding the following line: > SWIG_JavaArrayArgoutDouble(jenv, jarr2, arg2, jarg2); > I really don't see why this line is added by SWIG and all my tries to > remove it failed. > How can I get ride of this line ? > > My .i file is the following: > > %include "arrays_java.i" > > /* Transform the input datatype double[] to double[][] to facilitate > the > matching in Java */ > %typemap(jni) double[] "jobjectArray" > %typemap(jtype) double[] "double[][]" > %typemap(jstype) double[] "double[][]" > > %typemap(in) (double variable[], int nbRow, int nbCol) { > // Convert the double[][] => double * > [...] > } > > int putDouble(char * variableName, double variable[], int nbRow, int > nbCol); > You can analyse which typemaps are contributing code by using the -debug-tmused option to SWIG. If you grep the output for the variable name you are interested in you get: $ swig -java -c++ -debug-tmused example.i | grep -w variable example.i:9: Typemap for double variable[] (jni) : %typemap(jni) double [] example.i:9: Typemap for double variable[] (jtype) : %typemap(jtype) double [] example.i:9: Typemap for double variable[] (jstype) : %typemap(jstype) double [] example.i:9: Typemap for double variable[] (in) : %typemap(in) (double variable[],int nbRow,int nbCol) example.i:9: Typemap for double variable[] (typecheck) : %typemap(typecheck) double [] example.i:9: Typemap for double variable[] (argout) : %typemap(argout) double [] example.i:9: Typemap for double variable[] (freearg) : %typemap(freearg) double [] example.i:9: Typemap for double variable[] (jstype) : %typemap(jstype) double [] example.i:9: Typemap for double variable[] (javain) : %typemap(javain) double [] These show the typemaps that are being used for wrapping variable[], so one of these will contribute the SWIG_JavaArrayArgoutDouble code. If you look at each of these typemaps (you can use swig -E to see the preprocessed output) or just guess that the argout typemap is the source. As you are using an 'in' multi-argument typemap, you need to provide your own 'argout' multi-argument typemap: %typemap(argout) (double variable[], int nbRow, int nbCol) { ... code to marshal array elements from C++ to Java ... } Interestingly the 'freearg' typemap is silently ignored because it does not match the 'in' typemap (they are not both multi-argument typemaps). One could argue that the 'argout' typemap should be treated the same, but I'll probably just add a warning that the 'in' does not match 'freearg'. William |