【问题标题】:Using SWIG to create java bindings for C++ classes使用 SWIG 为 C++ 类创建 java 绑定
【发布时间】:2013-06-01 16:27:43
【问题描述】:

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

我的问题是多重继承。

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

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

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

【问题讨论】:

  • 所以,我在 I1.h 和 I2.h 中有两个纯虚拟类,还有一个继承自 I1 和 I2 的 Base 类。现在,当我尝试痛饮时,它会忽略警告 I2。 Java 不支持多重继承。所以我的问题是我如何在java中映射它。我看到可能性的原因是因为 I1 和 I2 类似于 Java 中的接口。如果我可以将它们映射到接口,我的工作就完成了。

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


【解决方案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 文件保持干净。

【讨论】:

  • 嗯,这确实是丑陋的:) 我的问题是它正在谈论的该死的大代码库。这种方式将需要相当多的努力。无论如何,我正在考虑继续使用包装器而不是整个代码库。 swig 有太多的顾虑,我们需要付出巨大的努力。 Wrapper 会在这里帮助我。并且可能是这些包装器之上的 SWIG。不是最好的解决方案,而是一个简单的解决方案。
猜你喜欢
  • 2019-10-14
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2019-01-09
  • 2011-02-25
  • 2022-01-14
相关资源
最近更新 更多