SWIG JAVA 如何使用 %interface 和纯虚方法包装 C++ 多重继承
SWIG JAVA how to wrap C++ multiple inheritance with %interface and pure virtual methods
我在使用 SWIG 将巨大的 C++ 代码包装到 JAVA 时遇到问题。
我想做的是包装一个 Derived class,它在 C++ 中扩展了另外 2 个 classes,但是 classes 之一(下面示例中的 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中的内容。
当我 运行 Swig 上面的例子时,它创建了 Base1 作为接口(它应该)
public interface Base1 {
long Base1_GetInterfaceCPtr();
void Method1();
}
并声明(在 JAVA 中)派生的 class 扩展 Base2 并实现 Base1(它也应该如此),BUT,它不会创建Derived class 中的一个 java 方法实现接口 Base1(Derived 中的 Method1)生成的完整 Derived Java class 如下:
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 生成的 class(派生)的 Java 编译错误,该错误未实现其接口 (Base1)
的所有方法
我错过了什么?我已经阅读了文档并且应该可以工作...
我的“.i”文件:(使用 swig 3.0.10)
%module SOURCEI
%include <swiginterface.i>
%interface_impl(Space::Base1);
%{
#include "Source.h"
%}
%include "Source.h"
我正在使用 swig 3.0.2,它非常适合我。我没有文件 swiginterface.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 试了一下,我确实在 Derived
中得到了一个方法
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
我在使用 SWIG 将巨大的 C++ 代码包装到 JAVA 时遇到问题。
我想做的是包装一个 Derived class,它在 C++ 中扩展了另外 2 个 classes,但是 classes 之一(下面示例中的 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中的内容。
当我 运行 Swig 上面的例子时,它创建了 Base1 作为接口(它应该)
public interface Base1 {
long Base1_GetInterfaceCPtr();
void Method1();
}
并声明(在 JAVA 中)派生的 class 扩展 Base2 并实现 Base1(它也应该如此),BUT,它不会创建Derived class 中的一个 java 方法实现接口 Base1(Derived 中的 Method1)生成的完整 Derived Java class 如下:
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 生成的 class(派生)的 Java 编译错误,该错误未实现其接口 (Base1)
的所有方法我错过了什么?我已经阅读了文档并且应该可以工作...
我的“.i”文件:(使用 swig 3.0.10)
%module SOURCEI
%include <swiginterface.i>
%interface_impl(Space::Base1);
%{
#include "Source.h"
%}
%include "Source.h"
我正在使用 swig 3.0.2,它非常适合我。我没有文件 swiginterface.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 试了一下,我确实在 Derived
中得到了一个方法 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