Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
int[]到列表的类型映射<;int>; 我设法从我的C++实现生成java类。为此,我有一个子词编码器。I: /* File : example.i */ %module encoder %{ #include "SubwordEncoder.h" %} /* Let's just grab the original header file here */ %include "SubwordEncoder.h"_Java_C++_Swig - Fatal编程技术网

int[]到列表的类型映射<;int>; 我设法从我的C++实现生成java类。为此,我有一个子词编码器。I: /* File : example.i */ %module encoder %{ #include "SubwordEncoder.h" %} /* Let's just grab the original header file here */ %include "SubwordEncoder.h"

int[]到列表的类型映射<;int>; 我设法从我的C++实现生成java类。为此,我有一个子词编码器。I: /* File : example.i */ %module encoder %{ #include "SubwordEncoder.h" %} /* Let's just grab the original header file here */ %include "SubwordEncoder.h",java,c++,swig,Java,C++,Swig,其中界面如下所示: 类子字编码器{ 公众: int*编码(字符*解码); 字符*解码(整数*编码); }; 生成的代码如下所示: 公共类子字编码器{ 专用瞬态长开关PTR; 受保护的瞬态布尔开关; 受保护的子字编码器(长cPtr、布尔cMemoryOwn){ swigcmomown=cMemoryOwn; swigCPtr=cPtr; } 受保护的静态长getCPtr(子字编码器obj){ 返回值(obj==null)?0:obj.swigCPtr; } 受保护的void finalize()

其中界面如下所示:

类子字编码器{
公众:
int*编码(字符*解码);
字符*解码(整数*编码);
};
生成的代码如下所示:

公共类子字编码器{
专用瞬态长开关PTR;
受保护的瞬态布尔开关;
受保护的子字编码器(长cPtr、布尔cMemoryOwn){
swigcmomown=cMemoryOwn;
swigCPtr=cPtr;
}
受保护的静态长getCPtr(子字编码器obj){
返回值(obj==null)?0:obj.swigCPtr;
}
受保护的void finalize(){
删除();
}
公共同步的void delete(){
如果(swigCPtr!=0){
如果(SWIGCWN){
swigcmoown=假;
编码器。删除子字编码器(swigCPtr);
}
swigCPtr=0;
}
}
公共开关类型p_int编码(字符串解码){
长cPtr=encoderJNI.SubwordEncoder_encode(swigCPtr,this,解码);
返回值(cPtr==0)?null:新的开关类型p_int(cPtr,false);
}
公共字符串解码(SWIGTYPE_p_int编码){
返回encoderJNI.SubwordEncoder_decode(swigCPtr,this,SWIGTYPE_p_int.getCPtr(encoded));
}
公共子词编码器(){
这(encoderJNI.new_SubwordEncoder(),true);
}
}
但是也可以从SWIG获得
列表
数组列表
可编辑
或类似的东西吗

char*
已经被转换为Java
字符串(从),但是扩展这些映射的最简单方法是什么


SWIG版本为4.0.0(Ubuntu)

< P>我会改变这个接口并使用C++容器(或迭代器/范围,但在SWIG中有点不太好支持)。从SWIG 3.1(或者可能是4.x?)开始,
std::vector
std::list
都应该正确实现合理的Java接口和autobox原语。因此,您的界面可能会变成:

class SubwordEncoder {
public:
    std::vector<int> encode(const std::vector<char>& decoded);
    std::vector<char> decode(const std::vector<int>& encoded);
};
类子字编码器{
公众:
std::矢量编码(const std::矢量和解码);
std::矢量解码(const std::矢量和编码);
};
然后,您可以将其包装为:

/* 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"
/*文件:example.i*/
%模块编码器
%包括
%{
#包括“SubwordEncoder.h”
%}
%模板(IntVector)std::vector;
%模板(CharVector)std::vector;
/*让我们在这里获取原始头文件*/
%包括“SubwordEncoder.h”
这有两个作用。首先,它引入了SWIG库对
std::vector
的支持。其次,它使用
%template
告诉SWIG使用两种类型显式实例化和包装向量模板。这些名称在Java中是合理的

有了这一点,你就可以很容易地安全地完成你要做的事情


需要注意的是,从
byte[]
int[]
或其他Java集合的自动转换不会自动发生在函数输入上。有可能创建一个接口,如果这个行为对你很重要/有用,但是它需要公平的几个类型映射和JNI调用。

< P>我会改变这个接口并使用C++容器(或者迭代器/范围,但是在SWIG中有点不太好支持)。从SWIG 3.1(或者可能是4.x?)开始,
std::vector
std::list
都应该正确实现合理的Java接口和autobox原语。因此,您的界面可能会变成:

class SubwordEncoder {
public:
    std::vector<int> encode(const std::vector<char>& decoded);
    std::vector<char> decode(const std::vector<int>& encoded);
};
类子字编码器{
公众:
std::矢量编码(const std::矢量和解码);
std::矢量解码(const std::矢量和编码);
};
然后,您可以将其包装为:

/* 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"
/*文件:example.i*/
%模块编码器
%包括
%{
#包括“SubwordEncoder.h”
%}
%模板(IntVector)std::vector;
%模板(CharVector)std::vector;
/*让我们在这里获取原始头文件*/
%包括“SubwordEncoder.h”
这有两个作用。首先,它引入了SWIG库对
std::vector
的支持。其次,它使用
%template
告诉SWIG使用两种类型显式实例化和包装向量模板。这些名称在Java中是合理的

有了这一点,你就可以很容易地安全地完成你要做的事情


需要注意的是,从
byte[]
int[]
或其他Java集合的自动转换不会自动发生在函数输入上。如果你的行为对你很重要,你就可以创建一个接口,但是它需要更多的类型映射和JNI调用。你愿意改变你的C++代码吗?使用C++中的迭代器代替指针可以打开更多的选项。还有一个相关的问题是,它展示了如何使用你在这里需要的autobox类型映射。哦,还有一个问题:有了这个界面,你怎么知道数组的长度呢?@Flexo。我只使用了
char*
,因为这会自动将数据类型转换为Java字符串。但我似乎无法从
std::vector
std::vector::iterator
中获得
列表或类似的内容:/@我必须设置“代码> STDVIVACT。我的代码/代码>显式地存在,这也是奇怪的,只有<代码> char */COD>被转换成java <代码>字符串< />代码>但是,不是<代码> STD::String < /C> >你愿意改变C++代码吗?使用C++中的迭代器代替指针可以打开更多的选项。还有一个相关的问题是,它展示了如何使用你在这里需要的autobox类型映射。哦,还有一个问题:有了这个界面,你怎么知道数组的长度呢?@Flexo。我只使用了
char*
,因为这会自动将数据类型转换为Java字符串。但我似乎无法从
std::vector
std::vector::iterator
中获得
列表或类似的内容:/@柔印版