From: William S F. <ws...@fu...> - 2008-09-01 19:57:32
|
Jean-Yves Lawson wrote: > Hi, > > I'm having troubles using the JAVA_ARRAYSOFCLASSES macro with an array > of classes declared in c++ like "MyClass** list;". I've read other posts > talking about it and succeeded in having simple examples working. > However the following configuration does fail: > > ->My MyClassTest.i file contains > -------MyClassTest.i------------ > %module MyClassTest > %include "typemaps.i" > %include "arrays_java.i" > %include "various.i" > JAVA_ARRAYSOFCLASSES(MyClass) > %apply MyClass[] { MyClass** list} > %include "MyClassDef.h" > ------------------------------ > > > ->MyClassDef.h contains > ------MyClassDef.h ----------- > MyClass{ > public: > int i; > int j; > int foobar(); > bool barfoo(); > }; > > class MyClasses{ > public: > void bar(int i); > void foo(); > MyClass** list; > }; > -------------------------------- > > > ->The generated MyClassTest_wrap.cxx is wrong(but compiles) and contains > the following code for accessing the MyClass Array: > -----MyClassTest_wrap.cxx--------------------- > SWIGEXPORT jlongArray JNICALL > Java_myPackage_MyClassTestJNI_MyClasses_1list_1get(JNIEnv *jenv, jclass > jcls, jlong jarg1, jobject jarg1_) { > jlongArray jresult = 0 ; > MyClasses *arg1 = (MyClasses*) 0 ; > MyClasses **result = 0 ; > > (void)jenv; > (void)jcls; > (void)jarg1_; > arg1 = *(MyClasses **)&jarg1; > result = (MyClass **) ((arg1)->list); > *(MyClass ***)&jresult = result; > return jresult; > } > --------------------------------------------------- > A 'MyClass** list' out typemap is needed for this wrapper. If you look inside the JAVA_ARRAYSOFCLASSES macro you'll see: %typemap(out) ARRAYSOFCLASSES[ANY] but no: %typemap(out) ARRAYSOFCLASSES[] so when you apply the [] typemaps, you are applying nothing and thus get the SWIG default. There are no [] out typemaps because it is impossible to know how big the array is that you are marshalling. I suggest you take the ARRAYSOFCLASSES[ANY] typemap and modify replacing $1_dim0 with the size of the returned array. > > ->The generated Java wrapper is also wrong(and do not compile) as > MyClasses.java contains the following accessor code: > ----------------MyClasses.java----------------- > public SWIGTYPE_p_p_MyClass[] getList() { > return > SWIGTYPE_p_p_MyClass.cArrayWrap(MyClassTestJNI.MyClasses_list_get(swigCPtr, > this), false); > } > ---------------------------------------------- > This is because you are applying typemaps intended for pointer (array) access to a pointer to a pointer. You can fix the java errors by putting this after the %apply: %typemap(jstype) MyClass** list "$*javaclassname[]" %typemap(javain) MyClass** list "$*javaclassname.cArrayUnwrap($javainput)" %typemap(javaout) MyClass** list { return $*javaclassname.cArrayWrap($jnicall, $owner); } This overrides the applied typemaps which come from the JAVA_ARRAYSOFCLASSES macro. William |