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

Type mapping for int[] to List<int>

我设法从我的 C++ 实现中生成了 Java class。为此,我有一个 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* 已经转换为 Java String(来自 docs)但是扩展这些映射的最简单方法是什么?

SWIG 版本为 4.0.0 (Ubuntu)

我会更改此接口并使用 C++ 容器(或 itereators/ranges,但 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"

这有两个作用。首先,它引入了 SWIG 库对 std::vector 的支持。其次,它使用 %template 告诉 SWIG 使用两种类型显式实例化和包装向量模板。这些在 Java.

中给出了合理的名称

有了它,安全地实现您在这里尝试做的事情应该会非常简单。

需要注意的是,byte[]int[] 或其他 Java 集合的自动转换不会自动发生在函数输入中。如果该行为对您来说 important/useful,则可以创建一个执行此操作的接口,但它需要更多的类型映射和 JNI 调用。