Для типов, о которых SWIG ничего не знает (т. Е. Не видел ничего, кроме предварительного объявления), лучшая оболочка, которую он может генерировать, приблизительно отражает то, что вы можете сделать с объявленным в C ++ классом вперед - он упаковывается как нечто, что ведет себя как непрозрачный указатель. Это SWIG_P_class1
вы видите. Вы можете делать разумные вещи с этим, например, если у вас есть метод, который возвращает ссылки или указатели на экземпляры, вы можете вызвать его, чтобы получить объект для передачи foo
.
Однако вы, вероятно, не хотите использовать так много в реальных интерфейсах, поэтому, учитывая заголовочный файл, мы хотим обернуть его следующим образом:
class class1;
bool foo(class1& parm);
Вы можете разумно обернуть его, дав SWIG частичное (или полное, если хотите) определение class1
, например ::
.
%module test
class class1 {
};
%include "test.hh"
приведет к тому, что разумные class1
и foo
будут представлены на стороне Java, поэтому вы можете использовать их в Java, как в:
test.foo(new class1());
точно так, как вы надеетесь.
Вам, конечно, нужно предоставить сгенерированному C ++ достаточное знание класса class1
, точно так же, как и в случае любого другого кода C ++. Самый простой способ сделать это, чтобы ваш интерфейс SWIG выглядел примерно так:
%module test
%{
#include "class1_defined_here.hh"
%}
class class1 {
};
%include "test.hh"