我正在制作一个C++库的包装器,因此它可以在Java中使用,我正在使用Swig.
我面临的是我有一个Class 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_ */
Run Code Online (Sandbox Code Playgroud)
ComplexData类:
#ifndef COMPLEXDATA_H_
#define COMPLEXDATA_H_
namespace ns2 {
class ComplexData {
public:
ComplexData(){}
virtual ~ComplexData(){}
};
} /* namespace ns2 */
#endif /* COMPLEXDATA_H_ */
Run Code Online (Sandbox Code Playgroud)
班级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_ */
Run Code Online (Sandbox Code Playgroud)
i文件片段如下所示:
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData&)";
Run Code Online (Sandbox Code Playgroud)
但这不起作用.哪一个是忽略方法的某些特定重载的正确方法?
完整的.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"
Run Code Online (Sandbox Code Playgroud)
注意:我认为它实际上没有任何关系,但为了以防万一,这些方法实际上抛出异常.
注2:我也认为不相关,但目标语言是Java,源语言是C++.
小智 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 ("$ignore", fullname=1) ns3::SomeClass::someMethod(const ns2::ComplexData &);
Run Code Online (Sandbox Code Playgroud)
我确实首先引用了引号,因为我一直都在为我工作,例如:
%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod";
Run Code Online (Sandbox Code Playgroud)
完整的 .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"
%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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4420 次 |
| 最近记录: |