2013-07-03 5 views
4

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

Что я вижу, так это то, что у меня есть класс SomeClass, который имеет некоторые перегруженные методы (someMethod). Из этих перегруженных методов некоторые получают сложные данные, которые я не хочу экспортировать в оболочку, а некоторые простые, которые я хочу, затем экспортируют.

Я пытаюсь использовать директиву %rename("$ignore"), но либо я получаю все методы экспортированы, либо ничего. У меня есть еще два типа классов SimpleData и ComplexData, один из них в пространстве имен ns1, а другой в ns2, SomeClass находится в пространстве имен '' ns3`.

Класс SimpleData:

#ifndef SIMPLEDATA_H_ 
#define SIMPLEDATA_H_ 

namespace ns1 { 

class SimpleData { 
public: 
    SimpleData(){} 
    virtual ~SimpleData(){} 
}; 

} /* namespace ns1 */ 
#endif /* SIMPLEDATA_H_ */ 

Класс ComplexData:

#ifndef COMPLEXDATA_H_ 
#define COMPLEXDATA_H_ 

namespace ns2 { 

class ComplexData { 
public: 
    ComplexData(){} 
    virtual ~ComplexData(){} 
}; 

} /* namespace ns2 */ 
#endif /* COMPLEXDATA_H_ */ 

SomeClass Класс:

#ifndef SOMECLASS_H_ 
#define SOMECLASS_H_ 

#include "SimpleData.h" 
#include "ComplexData.h" 

namespace ns3 { 

class SomeClass { 
public: 
    SomeClass(){} 
    bool someMethod(const ns1::SimpleData & data){return true;} 
    bool someMethod(const ns2::ComplexData & data){return true;} 
    bool someMethod(const int & data){return true;} 
    bool anotherMethod(); 
    virtual ~SomeClass(){} 
}; 

} /* namespace ns3 */ 
#endif /* SOMECLASS_H_ */ 

двутавровых файл фрагмент кода выглядит следующим образом:

%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData&)"; 

Но это не работает. Какой из них является правильным способом игнорировать определенную перегрузку метода?

Полный .и файл:

%module libSomeClass 

%{ 
    #include "../src/SomeClass.h" 
%} 

%pragma(java) jniclasscode=%{ 
    static { 
    try { 
     System.loadLibrary("SWIG_C++"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load. \n" + e); 
     System.exit(1); 
    } 
    } 
%} 

// SimpleData 
%include "../src/SimpleData.h" 

//removes too much 
//%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod"; 

//does not work 
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData &)"; 

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

%include "../src/SomeClass.h" 

Примечание: Я не думаю, что это на самом деле не имеет ничего общего, но только в случае, если эти методы на самом деле бросить исключение.

Note2: Я также не думаю, что это релевантно, но целевой язык - это Java, а исходным языком является C++.

ответ

2

Решение заключается в не использование цитат с сигнатурой метода.

%rename ("$ignore", fullname=1) ns3::SomeClass::someMethod(const ns2::ComplexData &); 

Я поставил кавычки в первую очередь потому, что у меня всегда есть и всегда работал для меня, например:

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

Полный .и файл для справки:

%module libSomeClass 

%{ 
    #include "../src/SomeClass.h" 
%} 

%pragma(java) jniclasscode=%{ 
    static { 
    try { 
     System.loadLibrary("SWIG_C++"); 
    } catch (UnsatisfiedLinkError e) { 
     System.err.println("Native code library failed to load. \n" + e); 
     System.exit(1); 
    } 
    } 
%} 

// SimpleData 
%include "../src/SimpleData.h" 

%rename ("$ignore", fullname=1) ns3::SomeClass::someMethod(const ns2::ComplexData &); 

%ignore ns3::SomeClass::someMethod(const int &); 

%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod"; 

%include "../src/SomeClass.h" 
6

Вы пробовали использовать только директиву% ignore, http://www.swig.org/Doc1.3/SWIG.html#SWIG_rename_ignore? Проверьте http://www.swig.org/Doc1.3/SWIGPlus.html#ambiguity_resolution_renaming, чтобы узнать, как наилучшим образом соответствовать функции, которую вы хотите игнорировать.

Также обратите внимание, что «Размещение директивы переименования% произвольно до тех пор, пока оно появляется перед тем, как объявления будут переименованы», является ли ваш% rename перед функцией?

(В вашем примере вы упускаете имя класса, я предполагаю, что это просто опечатка верно?)

+0

в документации указано, что '% ignore' и'% rename ("$ ignore") '[точно такие же] (http://www.swig.org/Doc2.0/SWIGDocumentation.html # SWIG_advanced_renaming), за исключением того, что '% rename' является немного более гибким. Да, мой '% rename' находится перед объявлением функции (точнее до'% include'). Да, отсутствие названия класса - опечатка. Я смог найти решение, похоже, проблема с использованием ** котировок ** в сигнатуре метода нечетно. Во всяком случае, спасибо за ваш ответ, он заставляет меня пройти через документы снова, и благодаря этому я понял, что в примерах нет котировок. –

Смежные вопросы