java - 使用 SWIG 为 C++ 类创建 java 绑定(bind)

标签 java c++ interface swig multiple-inheritance

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

我的问题是多重继承。

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

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

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

最佳答案

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

多重继承是接口(interface)之外的另一种范例,这使得很难将 Java 中的对象转换/解释为属于特定接口(interface)。

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

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

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

    protected:
        void bar();
}

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

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

关于java - 使用 SWIG 为 C++ 类创建 java 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948952/

相关文章:

C++:将字符串作为常量引用是否经常被认为是一种好习惯?

java - 从 recyclerview 适配器调用 Activity 方法

java - 如何从文本文件中读取我的输出?

java - NetBeans : Making sure that main method exists

java - 具有双重检查锁定的 map 同步

c# - 为什么我的方法需要错误的返回类型?

dictionary - 映射动态值类型?

java - Hibernate 返回错误的结果集并生成错误的查询

c++ - 带有 C++ 异常的 ANTLR3 C 目标

c++ - 声明现有原始指针所有权的正确方法