猿问

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

我设法从我的 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*已经转换为 Java String(来自文档)但是扩展这些映射的最简单方法是什么?


SWIG 版本为 4.0.0 (Ubuntu)


喵喵时光机
浏览 118回答 1
1回答

守候你守候我

我会更改此接口并使用 C++ 容器(或迭代器/范围,但在 SWIG 中不太支持)。从 SWIG 3.1(或者可能是 4.x?)开始,两者std::vector都std::list应该正确地实现合理的 Java 接口和自动装箱原语。所以你的界面可能变成这样:class SubwordEncoder {public:&nbsp; &nbsp; std::vector<int> encode(const std::vector<char>& decoded);&nbsp; &nbsp; 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 集合的自动转换不会自动发生在函数输入上。如果该行为对您很重要/有用,则可以创建一个接口来执行此操作,但它需要更多的类型映射和 JNI 调用。
随时随地看视频慕课网APP

相关分类

Java
我要回答