从int []到List <int>的类型映射

时间:2019-08-02 15:32:07

标签: java c++ swig

我设法从C ++实现中生成Java类。为此,我有一个SubwordEncoder.i

/* File : example.i */
%module encoder

%{
#include "SubwordEncoder.h"
%}

/* Let's just grab the original header file here */
%include "SubwordEncoder.h"

界面如下:

class SubwordEncoder {
public:
    int* encode(char* decoded);
    char* decode(int* encoded);
};

生成的代码如下所示:

public class SubwordEncoder {
  private transient long swigCPtr;
  protected transient boolean swigCMemOwn;

  protected SubwordEncoder(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  protected static long getCPtr(SubwordEncoder obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        encoderJNI.delete_SubwordEncoder(swigCPtr);
      }
      swigCPtr = 0;
    }
  }

  public SWIGTYPE_p_int encode(String decoded) {
    long cPtr = encoderJNI.SubwordEncoder_encode(swigCPtr, this, decoded);
    return (cPtr == 0) ? null : new SWIGTYPE_p_int(cPtr, false);
  }

  public String decode(SWIGTYPE_p_int encoded) {
    return encoderJNI.SubwordEncoder_decode(swigCPtr, this, SWIGTYPE_p_int.getCPtr(encoded));
  }

  public SubwordEncoder() {
    this(encoderJNI.new_SubwordEncoder(), true);
  }

}

但是是否也可能从SWIG获得List<Integer>ArrayList<int>Iterable<int>或类似的东西?

char*已经从docs转换为Java String,但是扩展这些映射的最简单方法是什么?

SWIG版本为4.0.0(Ubuntu)

1 个答案:

答案 0 :(得分:1)

我将更改此接口,并使用C ++容器(或迭代器/范围,但是SWIG支持的程度稍差)。从SWIG 3.1(或者可能是4.x?)开始,std::vectorstd::list都应正确实现明智的Java接口和自动装箱原语。因此您的界面可能会变成这样:

class SubwordEncoder {
public:
    std::vector<int> encode(const std::vector<char>& decoded);
    std::vector<char> decode(const std::vector<int>& encoded);
};

然后您可以用以下方法包装:

/* File : example.i */
%module encoder

%include <std_vector.i>

%{
#include "SubwordEncoder.h"
%}

%template(IntVector) std::vector<int>;
%template(CharVector) std::vector<char>;

/* Let's just grab the original header file here */
%include "SubwordEncoder.h"

这有两件事。首先,它为std::vector引入了SWIG库支持。其次,它使用%template告诉SWIG使用两种类型显式实例化和包装矢量模板。这些在Java中被赋予了明智的名称。

有了这些,就可以很容易地安全地实现您要在此处执行的操作。

需要注意的是,从byte[]int[]或其他Java集合进行自动转换不会自动发生在函数输入上。如果该行为对您很重要/很有用,则可能会创建一个执行此操作的接口,但这将需要更多的类型映射和JNI调用。