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::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 集合的自动转换不会自动发生在函数输入中。如果该行为对您来说 important/useful,则可以创建一个执行此操作的接口,但它需要更多的类型映射和 JNI 调用。
我设法从我的 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::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 集合的自动转换不会自动发生在函数输入中。如果该行为对您来说 important/useful,则可以创建一个执行此操作的接口,但它需要更多的类型映射和 JNI 调用。