Java 使用SWIG为C++;班级

Java 使用SWIG为C++;班级,java,c++,interface,swig,multiple-inheritance,Java,C++,Interface,Swig,Multiple Inheritance,使用SWIG能够为我的C++代码创建简单绑定。 我这里的问题是多重继承 我们的C++代码库有一个ICLAS作为基类,它充当接口。此外,我们还有从两个类派生的类,其中一个是这个接口类 现在我的问题是,假设我们可以将类iClass作为Java中的接口,我们可以使用SWIG为这样的代码库创建绑定吗 它仍然是多重继承,但它是一种非常特殊的情况,类似于java的接口概念 SWIG的情况是,它实际上只会扩展您列出的第一个基类(在下面的代码示例中是I1),而忽略其余的基类。有趣的是,C++编译的代码将包含所有

使用SWIG能够为我的C++代码创建简单绑定。 我这里的问题是多重继承

我们的C++代码库有一个ICLAS作为基类,它充当接口。此外,我们还有从两个类派生的类,其中一个是这个接口类

现在我的问题是,假设我们可以将类iClass作为Java中的接口,我们可以使用SWIG为这样的代码库创建绑定吗


它仍然是多重继承,但它是一种非常特殊的情况,类似于java的接口概念

SWIG的情况是,它实际上只会扩展您列出的第一个基类(在下面的代码示例中是I1),而忽略其余的基类。有趣的是,C++编译的代码将包含所有的基本方法,它们对于java JNI包装器是不可用的。p> 多重继承是接口之外的另一种范例,这使得Java中的对象很难强制转换/解释为属于特定接口

不过,您可以做的是将编译器指令添加到从多个类继承的类的头文件中,这确实让人觉得有点麻烦。像这样:

class Foo : public I1, I2
{
    public:
        Foo();
        ~Foo();

        #ifdef SWIG
        void aI2Method();
        double aI2Property;
        #endif

    protected:
        void bar();
}
使用SWIG编译时,定义了属性SWIG。因此,SWIG使用方法“aI2Method”和公共属性“aI2Property”(为了论证,我们假设它们是在基类I2中定义的),并在JNI包装器中为此类“Foo”定义。只需在条件指令之间添加公共方法/属性


在Java中,您可以在Foo上调用“aI2Method”,或者获取/设置公共的“aI2Property”属性,本机编译代码将在I2基类上调用这些属性。注意,这意味着您不需要在“Foo”的.cpp文件中添加相同的指令,包括这些方法的定义或函数体,因为将其放在头文件中就足够了。这样,至少.cpp文件保持干净。

因此,我在I1.h和I2.h中有两个纯虚拟类,还有一个从I1和I2继承的类基。现在,当我尝试刷它得到了警告I2忽略。Java中不支持多重继承。所以我的问题是如何在java中映射它。我之所以看到这种可能性,是因为I1和I2类似于Java中的接口。如果我能将它们映射到接口,我的工作就完成了。好吧,这真是太糟糕了:)我的问题是我所说的那该死的大代码库。这样做需要相当多的努力。无论如何,我想继续使用包装器,而不是整个代码库。swig有太多的顾虑,我们需要付出巨大的努力。包装工会帮我的。可能是在这些包装纸上痛饮。这不是一个最好的解决方案,而是一个简单的解决方案。