我正在制作一个 C++ 库的包装器,以便可以从 Java 中使用它,我正在使用 Swig 进行此操作。
我面临的是我有一个 Class SomeClass
,它有一些重载的方法(someMethod
)。在这些重载方法中,一些接收我不想导出到包装器的复杂数据,而一些我想要然后导出的简单数据。
我正在尝试使用该%rename("$ignore")
指令,但要么导出所有方法,要么没有。我还有另外两种类型的类SimpleData
,ComplexData
其中一种在命名空间中,ns1
另一种在命名空间“ns3”中。ns2
SomeClass
班级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_ */
i 文件片段如下所示:
%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"
注意:我认为这实际上无关紧要,但以防万一,这些方法实际上会引发异常。
注2:我也不认为是相关的,但目标语言是Java,源语言是C++。