Ошибка константности в SWIG-генерируемом коде оболочки для Director - PullRequest
1 голос
/ 16 февраля 2012

Итак, я пытаюсь использовать swig , чтобы обернуть библиотеку c ++ для выполнения вызовов JNI.Но файл _wrap.cxx, который создает для меня swig, не будет правильно скомпилирован в 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 ++ step выдает следующую ошибку:

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 ++, который я мог бы использовать, чтобы игнорировать ошибку константности?

Случайные примечания: я не могу контролировать заголовок ввода, поэтому изменение сигнатуры функции не требуется.Похоже, не имеет значения, какой тип входного параметра - класс или структура.Если сделать его константной ссылкой вместо параметра константного значения, то это «исправит» ошибку, заставив SWIG явно отбросить константу (но опять же, я не могу изменить входной заголовок).

Заранее спасибо!

...