swigjava如何包装C++;具有%接口和纯虚拟方法的多重继承 我在使用SWIG ./P>将一个巨大的C++代码封装到java时遇到了问题。 我想做的是包装一个派生类,它扩展C++中的2个其他类,但是其中一个类(BaseBayle上的Base1)应该被封装为接口。(说明Java没有多重继承) 我发现了这个问题,并创建了一个简单的C++代码来演示这个问题: namespace Space { class Base1 { public: virtual void Method1() = 0; }; class Base2 { public: virtual void Method2(); }; class Derived : public Base1, public Base2 { public: virtual void Method1(); }; }

swigjava如何包装C++;具有%接口和纯虚拟方法的多重继承 我在使用SWIG ./P>将一个巨大的C++代码封装到java时遇到了问题。 我想做的是包装一个派生类,它扩展C++中的2个其他类,但是其中一个类(BaseBayle上的Base1)应该被封装为接口。(说明Java没有多重继承) 我发现了这个问题,并创建了一个简单的C++代码来演示这个问题: namespace Space { class Base1 { public: virtual void Method1() = 0; }; class Base2 { public: virtual void Method2(); }; class Derived : public Base1, public Base2 { public: virtual void Method1(); }; },java,c++,inheritance,swig,Java,C++,Inheritance,Swig,上面的代码表示我想用JAVA包装的内容 当我在上面的示例上运行Swig时,它会创建Base1作为接口(它应该这样做) 并声明(在JAVA中)扩展Base2并实现Base1的派生类(它也应该这样做),但,它不会在实现接口Base1的派生类内创建JAVA方法(派生中的Method1)。生成的完整派生JAVA类如下所示: public class Derived extends Base2 implements Base1 { private transient long swigCPtr;

上面的代码表示我想用JAVA包装的内容

当我在上面的示例上运行Swig时,它会创建Base1作为接口(它应该这样做)

并声明(在JAVA中)扩展Base2并实现Base1的派生类(它也应该这样做),,它不会在实现接口Base1的派生类内创建JAVA方法(派生中的Method1)。生成的完整派生JAVA类如下所示:

public class Derived extends Base2 implements Base1 {
  private transient long swigCPtr;

  protected Derived(long cPtr, boolean cMemoryOwn) {
    super(SOURCEIJNI.Derived_SWIGUpcast(cPtr), cMemoryOwn);
    swigCPtr = cPtr;
  }

  protected static long getCPtr(Derived obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        SOURCEIJNI.delete_Derived(swigCPtr);
      }
      swigCPtr = 0;
    }
    super.delete();
  }

  public long Base1_GetInterfaceCPtr() {
    return SOURCEIJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
  }

  public Derived() {
    this(SOURCEIJNI.new_Derived(), true);
  }
}
因此,我遇到了SWIG生成的类(派生类)的Java编译错误,该类没有实现其接口(Base1)的所有方法

我错过了什么?我已经阅读了文档,应该可以

我的“.i”文件:(使用swig 3.0.10)

%module SOURCEI
%包括
%接口impl(Space::Base1);
%{
#包括“Source.h”
%}
%包括“Source.h”

我正在使用swig 3.0.2,它非常适合我。我没有文件
SwiginInterface.I
。我的Java安装有点混乱,所以我尝试使用Python和Ruby。对于这两种语言,我制作了一个稍微不同的接口文件

%module example
%{
  #define SWIG_FILE_WITH_INIT
  #include "Source.h"
%}

%interface_impl(Space::Base1);

%include "Source.h"
我配备了默认的虚拟析构函数的头文件

namespace Space {
  class Base1 {
  public:
    virtual void Method1() = 0;
    virtual ~Base1() = default;
   };
  class Base2 {
    public:
    virtual void Method2();
    virtual ~Base2() = default;
  };
  class Derived : public Base1, public Base2 {
    public:
    virtual void Method1();
  };
}
我只是用Java尝试了一下,我确实得到了一个内部派生的方法

 public void Method1() {
     exampleJNI.Derived_Method1(swigCPtr, this);
 }
我将上述内容汇编如下

swig -java -c++ Source.i
g++ -std=c++11 -fPIC -c Source.cpp Source_wrap.cxx -I/usr/lib/jvm/java-7-openjdk-amd64/include/
g++ -std=c++11 -fPIC -shared Source.o  Source_wrap.o -o libShared.so

谢谢你的帮助,但我尝试使用你的.i和你的.h,它给出了相同的错误。我下载了swig 3.0.2,它给出了错误“Warning 813:Warning for Space::Derived proxy:Base Space::Base2 ignored.Java不支持多重继承”。如何在命令行上调用swig?我使用:swig.exe-package teste.sourcepackage-small-v-outdir temp-c++-java-o temp/SOURCEJAVA_wrap.cxx Source.iI在windows上运行(下载预编译的windows发行版)发现问题。。。。这是“-small”命令。。。我使用它是因为我的包装器变大了,我在某处读到它压缩了生成的包装器。。。但它做的不止这些”-虚拟消除和压缩模式下的小编译“我猜“虚拟消除”部分忽略了纯虚拟方法。。。我把“-small”改为“-fcompact”,现在开始工作了@BernardoFrankenfeld很高兴你发现了错误。我运行
swig-java-c++Source.I
如果我删除纯虚拟的“=0”并删除派生中method1的声明,它确实可以工作。但是对于我的项目,我不能更改“.h”s<代码>命名空间空间{class Base1{public:virtual void Method1();};class Base2{public:virtual void Method2();};类派生:public Base1,public Base2{};}
 public void Method1() {
     exampleJNI.Derived_Method1(swigCPtr, this);
 }
swig -java -c++ Source.i
g++ -std=c++11 -fPIC -c Source.cpp Source_wrap.cxx -I/usr/lib/jvm/java-7-openjdk-amd64/include/
g++ -std=c++11 -fPIC -shared Source.o  Source_wrap.o -o libShared.so