Java から使用できるように C++ ライブラリのラッパーを作成しています。これは Swig で行っています。
私が直面しているのは、SomeClass
いくつかのオーバーロードされたメソッド ( someMethod
) を持つ Class があることです。このオーバーロードされたメソッドのうち、ラッパーにエクスポートしたくない複雑なデータを受け取るものと、エクスポートしたい単純なものがあります。
%rename("$ignore")
ディレクティブを使用しようとしていますが、すべてのメソッドがエクスポートされるか、まったくエクスポートされません。別の 2 種類のクラスがSimpleData
ありComplexData
、そのうちの 1 つは名前空間にns1
あり、もう1 つは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_ */
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++ です。