5

Java から使用できるように C++ ライブラリのラッパーを作成しています。これは Swig で行っています。

私が直面しているのは、SomeClassいくつかのオーバーロードされたメソッド ( someMethod) を持つ Class があることです。このオーバーロードされたメソッドのうち、ラッパーにエクスポートしたくない複雑なデータを受け取るものと、エクスポートしたい単純なものがあります。

%rename("$ignore")ディレクティブを使用しようとしていますが、すべてのメソッドがエクスポートされるか、まったくエクスポートされません。別の 2 種類のクラスがSimpleDataありComplexData、そのうちの 1 つは名前空間にns1あり、もう1 つはns2SomeClassあり、名前空間 ''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++ です。

4

2 に答える 2

3

解決策は、メソッド シグネチャで引用符を使用しないことです。

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

私は常に私のために働いてきたので、最初に引用符を付けました。たとえば、次のようになります。

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

参照用の完全な .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"
于 2013-07-17T20:55:00.360 に答える