SWIG JAVA 如何使用 %interface 和纯虚拟方法包装C++多重继承
SWIG JAVA how to wrap C++ multiple inheritance with %interface and pure virtual methods
我在使用 SWIG 将大量C++代码包装到 JAVA 时遇到了问题。
我试图做的是包装一个 Derived 类,该类在 C++ 中扩展了其他 2 个类,但其中一个类(示例下面的 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 中)扩展 Base2 并实现 Base1 的派生类(它也应该),但是,它不会在实现接口 Base1 的派生类中创建 java 方法(派生中的方法1)生成的完整派生 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
%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 尝试过,我确实在派生中得到了一个方法
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
相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 使用模板而不是虚拟方法的管道模式
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 出于什么目的,非虚拟方法将与C++一起使用?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 如何重写继承的嵌套类中存在的虚拟方法
- 私有虚拟方法有什么用?
- 派生类中纯虚拟基方法的专业化
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 确保模拟的 GTest 方法覆盖虚拟方法
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 如何调用孩子的方法:虚拟关键字不起作用