Java-SWIG和vtkSmartPointer

时间:2014-10-21 13:03:41

标签: java c++ swig vtk

我有一个类Foo,它需要ctor中的两个参数:

typedef vtkSmartPointer<vtkRenderer> t_renderer;
typedef vtkSmartPointer<vtkRenderWindow> t_rwindow;
typedef vtkSmartPointer<vtkRenderWindowInteractor> t_interactor;

class Foo {
public:
    Foo(renderer> ren, interactor inter);
    // ...
}

// Usage:
t_renderer   ren   = t_renderer::New();
t_rwindow    rwin  = t_rwindow::New();
t_interactor inter = t_interactor::New();

Foo f(ren, inter);
f.method1();
// ...

使用SWIG,我想在Java中使用相同的内容:

vtkRenderer ren = new vtkRenderer();
// ...
Foo f = new Foo(ren, inter);
f.method1();
// ...

问题是,SWIG会生成两个文件:

  • SWIGTYPE_p_vtkSmartPointerT_vtkRenderer_t.java
  • SWIGTYPE_p_vtkSmartPointerT_vtkRenderWindowInteractor_t.java

Foo的java ctor也是这样的:

public Animator(SWIGTYPE_p_vtkSmartPointerT_vtkRenderer_t renderer, SWIGTYPE_p_vtkSmartPointerT_vtkRenderWindowInteractor_t inter) {
   ...
}

所以我的问题是:我如何在SWIG中避免这种情况?我的界面文件是:

%module(directors="1", allprotected="1") swiganimator

%include <std_string.i>
%include <std_shared_ptr.i>

%{
    #include <memory>
    #include <string>
    #include "Foo.hpp"
%}

%shared_ptr(OtherType)

%include "Foo.hpp"

我希望你能解决这里描述的问题。

1 个答案:

答案 0 :(得分:0)

我看到的一个问题是SWIG需要被告知模板实例化;否则,它不会为它们生成代码。

%template(spRenderer)   vtkSmartPointer<vtkRenderer>;
%template(spWindow)     vtkSmartPointer<vtkRenderWindow>;
%template(spInteractor> vtkSmartPointer<vtkRenderWindowInteractor>;