无法弄清楚如何使SWIG / Java强制一个代理类来实现一个接口

时间:2011-03-29 19:20:53

标签: java interface proxy swig

我正在使用SWIG将c ++类导出到Java,但是在尝试强制代理对象实现接口时遇到了问题。

我搜索了SWIG文档,发现你可以使用“%pragma(java)jniclassinterfaces = x”让JNI类实现给定的接口,并使用“%pragma(java)moduleinterfaces = x”让模块实现任何给定的接口,但实际代理对象没有相应的编译指示。

我希望让SWIG生成'implements X'代码,因为稍后尝试添加该实现很困难。例如,如果我尝试子类化SWIG代理然后实现接口,我会遇到问题,因为我也使用泛型:

interface IVector<VectorType> {
   VectorType add(VectorType other);
   ...
}

所以这样的事情失败了:

class MyVector extends MyProxyVector implements IVector<MyVector> {
    MyVector add(MyVector other) {
        return (MyVector) super.add(other);
    }
}

因为它需要将父类转换为子类。

我能解决此问题的唯一方法是创建包装类或使用复制构造函数。两者似乎都有点低效,因为它们的目的是实现一个接口。

1 个答案:

答案 0 :(得分:6)

这应该通过typemaps mechanism处理。 以下代码:

%module test

%typemap(javainterfaces) Foo "SomeInterface"
%typemap(javabase) Foo "SomeBase"

struct Foo {
};

设置Foo的基数和接口,如下所示:

public class Foo extends SomeBase implements SomeInterface {

//...

在生成的Java代理类中。