I find it hard to get a SWIG typemap (javapackage) to work properly. I tried to make a simple version of the problem, and even this seems to fail.
foo.h:
#ifndef FOO_H #define FOO_H class Foo { public: Foo() {}; int doSomething() { return 1 }; }; #endif
bar.h:
#ifndef BAR_H #define BAR_H #include "foo.h" class Bar { public: Bar() {}; int doSomething(Foo foo) { return foo.doSomething(); }; }; #endif
Foo.i
%module FooMod %include "typemaps.i" %include "stdint.i" %{ #include "../header/foo.h" %} %include "../header/foo.h"
Bar.i
%module BarMod %import "Foo.i" %typemap("javapackage") Foo, Foo *, Foo & "com.me.t.foo"; %include "typemaps.i" %include "stdint.i" %{ #include "../header/bar.h" %} %include "../header/bar.h"
By running them using the following commands:
swig -c++ -java -package com.me.t.foo -outdir ../../src/com/me/t/foo -o ../src/Foo.cpp Foo.i swig -c++ -java -package com.me.t.bar -outdir ../../src/com/me/t/bar -o ../src/Bar.cpp Bar.i
And I get this output:
package com.me.t.bar; public class Bar { private long swigCPtr; protected boolean swigCMemOwn; protected Bar(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } protected static long getCPtr(Bar obj) { return (obj == null) ? 0 : obj.swigCPtr; } protected void finalize() { delete(); } public synchronized void delete() { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; BarModJNI.delete_Bar(swigCPtr); } swigCPtr = 0; } } public Bar() { this(BarModJNI.new_Bar(), true); } public int doSomething(Foo foo) { return BarModJNI.Bar_doSomething(swigCPtr, this, Foo.getCPtr(foo), foo); } }
BarModJNI.java:
package com.me.t.bar; public class BarModJNI { public final static native long new_Bar(); public final static native int Bar_doSomething(long jarg1, Bar jarg1_, long jarg2, Foo jarg2_); public final static native long Bar_getFoo(long jarg1, Bar jarg1_); public final static native void delete_Bar(long jarg1); }
Files are created correctly, but note that there is no import statement , so Foo cannot be found from any of the Bar Java classes. This is a simple example, but just hardcoding the import statement is not an option for me, because the generated source files containing C JNI code may have the wrong location of the Foo class files.
This seems like a very simple and common problem, so I wonder if I missed something or if something is wrong.
Thanks for the help!