2012-01-10 4 views
0

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

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

У меня есть Си ++ вроде этого:

bool foo(class1& parm); 

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

+1

Вы предпринимали какие-либо усилия самостоятельно? – simchona

ответ

0

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

0

Для типов, которые 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"