자바에서 사용할 수 있도록 C++ 라이브러리의 래퍼를 만들고 있습니다. 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&)";
하지만 작동하지 않습니다. 어떤 메소드의 특정 오버로드를 무시하는 올바른 방법은 무엇입니까?
전체 .I 파일 :
%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"
참고 : 나는 실제로 그것을 생각 할 수 없다하지만 단지의 경우, 이러한 방법은 실제로 예외를 throw하지 않습니다.
주 2 : 관련성은 없지만 대상 언어는 Java이고 원본 언어는 C++입니다.
문서는'% ignore'와'% rename ("$ ignore")'[정확히 일치 함] (http://www.swig.org/Doc2.0/SWIGDocumentation)을 언급하고있다.html # SWIG_advanced_renaming). '% rename'은 좀 더 유연합니다. 네, 제 '% rename'은 함수 선언 앞에 있습니다 (더 정확하게는'% include' 이전). 클래스 이름이 부족한 것은 오타입니다. 나는 해결책을 찾을 수 있었고, 이상한 방법 서명에서 ** 따옴표 **를 사용하는 것으로 보인다. 어쨌든 당신의 대답을 주셔서 감사합니다, 그것은 나를 통해 문서를 다시 통과하고 그 덕분에 나는 예제가 따옴표가 없다는 것을 깨달았습니다. –