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 调用。
添加回答
举报