Сгенерированный класс Swig в файле интерфейса Swig - PullRequest
0 голосов
/ 10 января 2012

Я использую SWIG для создания классов Java, и у меня есть 3 различных класса, один из которых зависит от других. SWIG делает указатели на эти классы, потому что он не знал об этом, мне нужно, чтобы SWIG использовал созданные классы Java, а не указатели, которые создает SWIG.

Как я могу это сделать?

У меня есть функция C ++, как это:

bool foo(class1& parm);

Теперь я использую SWIG для создания class1 в Java и хочу сделать SWIG для переноса foo в Java с параметром class1, который он создал, а не SWIG_P_class1. У меня нет никакого способа сделать это.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Для типов, о которых 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"
0 голосов
/ 10 января 2012

Swig скрывает детали, такие как используемые классы или объекты. Если вы хотите получить доступ к реальным объектам и классам Java, я предлагаю вам использовать JNI (который дает вам доступ ко всему и, вероятно, будет быстрее)

...