5

我正在制作一个 C++ 库的包装器,以便可以从 Java 中使用它,我正在使用 Swig 进行此操作。

我面临的是我有一个 Class SomeClass,它有一些重载的方法(someMethod)。在这些重载方法中,一些接收我不想导出到包装器的复杂数据,而一些我想要然后导出的简单数据。

我正在尝试使用该%rename("$ignore")指令,但要么导出所有方法,要么没有。我还有另外两种类型的类SimpleDataComplexData其中一种在命名空间中,ns1另一种在命名空间“ns3”中。ns2SomeClass

班级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

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 指令的位置是任意的,只要它出现在要重命名的声明之前”,你的 %rename 是在函数之前吗?

(在您的示例中,您缺少类名,我认为这只是一个错字,对吗?)

于 2013-07-16T14:46:03.663 回答
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 回答