使用SWIG为C ++类创建Java绑定

时间:2013-06-05 20:11:35

标签: java c++ interface swig multiple-inheritance

使用SWIG可以为我的C ++代码创建简单的绑定。

我的问题是多重继承。

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

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

它仍然是多重继承,但它是一个非常具体的例子,与java的接口概念类似。

1 个答案:

答案 0 :(得分:1)

SWIG的情况是它确实只会扩展你列出的第一个基类(在下面的代码示例中将是I1)并省略其余的基类。有趣的是,C ++编译的代码将包含所有基本方法,它们只是Java JNI包装器不可用。

多重继承是另一种范式,而不是接口,因此很难将Java中的Object转换/解释为属于特定接口。

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

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

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

    protected:
        void bar();
}

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

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