为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2023-05-10 16:28:26
我设法从我的 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)
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

我会更改此接口并使用 C++ 容器(或迭代器/范围,但在 SWIG 中不太支持)。从 SWIG 3.1(或者可能是 4.x?)开始,两者std::vector都std::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 集合的自动转换不会自动发生在函数输入上。如果该行为对您很重要/有用,则可以创建一个接口来执行此操作,但它需要更多的类型映射和 JNI 调用。


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信