SWIG生成的Director包装器代码中的Constness错误

时间:2012-02-16 14:55:45

标签: java const swig

所以,我正在尝试使用swig来包装一个c ++库来对它进行JNI调用。但是,swig为我创建的_wrap.cxx文件将无法在g ++中干净地编译。我做错了什么?

这是一个简单的测试用例,它将重现错误,以及其他一些没有错误的情况。我的头文件:

class MyClass {
};

class MyDirectored {
public:
  virtual void Overridable (MyClass const clz);
  virtual ~MyDirectored();
};

这是我的.i文件:

%module("directors="1") swigtest
%{
#include "swig.h"
%}

%feature("director") MyDirectored

%include "swig.h"

我正在尝试通过以下方式构建:

swig -c++ -package gen -java -outdir gen swig.i
g++ -c swig_wrap.cxx -o swig_wrap.o

g ++步骤产生以下错误:

swig_wrap.cxx: In member function 'virtual void SwigDirector_MyDirectored::Overridable(MyClass)':
swig_wrap.cxx:436: error: invalid conversion from 'const MyClass*' to 'MyClass*'

这似乎是一个合理的抱怨 - 生成的swig_wrap.cxx文件看起来像(很多碎片)

void SwigDirector_MyDirectored::Overridable (MyClass const clz) {
  //...
  jlong jclz;
  //...
  *((MyClass **)&jclz) = &clz; //Error on this line
  //...
}

我在swig 2.0.4和1.3.40,Linux和Windows中都遇到了同样的错误。有什么建议?我可以使用任何g ++技巧来忽略constness错误吗?

随机说明:我无法控制输入标题,因此更改功能签名是不行的。输入参数的类型 - 类或结构似乎并不重要。使它成为const引用而不是const值参数会通过使SWIG显式地抛弃constness来“修复”错误(但同样,我无法更改输入头)。

提前致谢!

0 个答案:

没有答案