3

使用 SWIG,我能够为我的 C++ 代码创建简单的绑定。

我的问题是多重继承。

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

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

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

4

1 回答 1

1

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

多重继承是接口之外的另一种范式,因此很难将 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 中定义)并在此类“Foo”的 JNI 包装器中定义。只需在条件指令之间添加公共方法/属性。

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

于 2013-06-12T11:31:24.277 回答