我正在使用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);
}
}
因为它需要将父类转换为子类。
我能解决此问题的唯一方法是创建包装类或使用复制构造函数。两者似乎都有点低效,因为它们的目的是实现一个接口。
答案 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代理类中。