Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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
使用SWIG在重载的C++;方法 我正在编写C++库,它将被不同平台上的应用程序使用,包括Android。 对于Android构建,使用了SWIG(我不能改变这个选择,而且我从未使用过SWIG)。 Java到C++的自动类型转换工作得很好,直到我被分配到init方法重载任务 代码> init < /Cult> C++接口为: /** *从文件初始化分类器 *@param modelPath std::string模型文件的完整路径 *@返回分类器可能的值: *成功时指向分类器实例的指针 *否则为空 */ 静态分类器*init(const std::string和modelPath);_Java_Android_C++_Swig - Fatal编程技术网

使用SWIG在重载的C++;方法 我正在编写C++库,它将被不同平台上的应用程序使用,包括Android。 对于Android构建,使用了SWIG(我不能改变这个选择,而且我从未使用过SWIG)。 Java到C++的自动类型转换工作得很好,直到我被分配到init方法重载任务 代码> init < /Cult> C++接口为: /** *从文件初始化分类器 *@param modelPath std::string模型文件的完整路径 *@返回分类器可能的值: *成功时指向分类器实例的指针 *否则为空 */ 静态分类器*init(const std::string和modelPath);

使用SWIG在重载的C++;方法 我正在编写C++库,它将被不同平台上的应用程序使用,包括Android。 对于Android构建,使用了SWIG(我不能改变这个选择,而且我从未使用过SWIG)。 Java到C++的自动类型转换工作得很好,直到我被分配到init方法重载任务 代码> init < /Cult> C++接口为: /** *从文件初始化分类器 *@param modelPath std::string模型文件的完整路径 *@返回分类器可能的值: *成功时指向分类器实例的指针 *否则为空 */ 静态分类器*init(const std::string和modelPath);,java,android,c++,swig,Java,Android,C++,Swig,正在生成以下代码: 公共静态分类器init(字符串modelPath){ 长cPtr=CLJNI.Classifier\u init\u SWIG\u 0(modelPath); 返回值(cPtr==0)?null:新分类器(cPtr,true); } > C++: /** *从内存块初始化分类器 *@param modelMemory char*指向存储模型定义的内存块的指针 *@param modelMemorySize大小\u t分配给模型存储的内存块大小 *@返回分类器可能的值: *

正在生成以下代码:

公共静态分类器init(字符串modelPath){
长cPtr=CLJNI.Classifier\u init\u SWIG\u 0(modelPath);
返回值(cPtr==0)?null:新分类器(cPtr,true);
}
<新<代码> init < /C> > C++:

/**
*从内存块初始化分类器
*@param modelMemory char*指向存储模型定义的内存块的指针
*@param modelMemorySize大小\u t分配给模型存储的内存块大小
*@返回分类器可能的值:
*成功时指向分类器实例的指针
*否则为空
*/
静态分类器*init(char*modelMemory,const size\u t modelMemorySize);
SWIG生成的Java代码为:

公共静态分类器init(字符串modelMemory,长modelMemorySize){
长cPtr=CLJNI.Classifier\u init\u SWIG\u 1(modelMemory,modelMemorySize);
返回值(cPtr==0)?null:新分类器(cPtr,true);
}
但我需要Java方法:

Classifier init(byte[] modelMemory, long modelMemorySize);
i、 e.
char*
必须转换为
byte[]
而不是
String

我应该在Classifier.I文件(现在看起来如下)中做什么更改,以使两个
init
方法可用于Java调用

%{
#包括“h组”
#包括“分类器.h”
%}
//Java程序员害怕“delete”方法,所以我们不得不对它进行重命名。
//是的,该死的蠢货,我知道。
%类型映射(javadestruct,methodname=“dispose”,methodmodifiers=“public synchronized”)CL::分类器{
if(swigCPtr!=0&&swigcmoown){
swigcmoown=假;
$jnicall;
}
swigCPtr=0;
}
%类型映射(javafinalize)CL::分类器%{
受保护的void finalize(){
处置();
}
%}
%新对象CL::分类器::初始化;
%包括“分类器.h”
以下解决方案(基于)在SWIG 2.0.11和SWIG 3.0.8上检查:

%模块分类器
%{
#包括“h组”
#包括“分类器.h”
%}
%typemap(jtype)(有符号字符*modelMemory,常量大小\u t modelMemorySize)“字节[]”
%类型映射(jstype)(有符号字符*modelMemory,常量大小\u t modelMemorySize)“字节[]”
%typemap(jni)(签名字符*modelMemory,常量大小\u t modelMemorySize)“jbyteArray”
%typemap(javain)(签名字符*modelMemory,常量大小\u t modelMemorySize)“$javainput”
%typemap(in,numinput=1)(有符号字符*modelMemory,常量大小\u t modelMemorySize){
$1=JCALL2(GetByteArrayElements,jenv,$input,NULL);
$2=JCALL1(GetArrayLength,jenv,$input);
}
%typemap(freearg)(签名字符*modelMemory,常量大小\u t modelMemorySize){
//或者,如果更改是副本,则使用0而不是中止来保留更改
JCALL3(ReleaseByteArrayElements,jenv,$input,$1,JNI_ABORT);
}
%类型映射(javadestruct,methodname=“dispose”,methodmodifiers=“public synchronized”)CL::分类器{
if(swigCPtr!=0&&swigcmoown){
swigcmoown=假;
$jnicall;
}
swigCPtr=0;
}
%类型映射(javafinalize)CL::分类器%{
受保护的void finalize(){
处置();
}
%}
%新对象CL::分类器::初始化;
%包括“分类器.h”
%包括“arrays\u java.i”
%apply
(在原始示例中编写)被认为是不必要的

这很好,提供了两种
init
方法:

公共静态分类器init(字符串modelPath){
长cPtr=CLJNI.Classifier\u init\u SWIG\u 0(modelPath);
返回值(cPtr==0)?null:新分类器(cPtr,true);
}
公共静态分类器init(字节[]modelMemory){
长cPtr=CLJNI.Classifier\u init\u SWIG\u 1(modelMemory);
返回值(cPtr==0)?null:新分类器(cPtr,true);
}
但是需要使用
signed char*
类型而不是
char*
。 否则

 public static Classifier init(String modelMemory, long modelMemorySize)
生产

我还发现,对于SWIG 3.0.8而言,解决方案只能在一个额外的行中:

 %apply(char *STRING, size_t LENGTH) { (signed char *modelMemory, size_t modelMemorySize) };
即分类器。I是:

%模块分类器
%{
#包括“h组”
#包括“分类器.h”
%}
%应用(字符*字符串,大小\长度){(有符号字符*模型内存,大小\模型内存化)};
%类型映射(javadestruct,methodname=“dispose”,methodmodifiers=“public synchronized”)CL::分类器{
if(swigCPtr!=0&&swigcmoown){
swigcmoown=假;
$jnicall;
}
swigCPtr=0;
}
%类型映射(javafinalize)CL::分类器%{
受保护的void finalize(){
处置();
}
%}
%新对象CL::分类器::初始化;
%包括“分类器.h”
对于SWIG 2.0.11,这种方式会导致编译错误,因为生成的包装器(CLJAVA_wrap.cxx)不正确:

SwigeExport jlong JNICALL Java\u impl\u tools\u CLJNI\u Classifier\u 1nit\u 1\u 1SWIG\u 11(JNIEnv*jenv,jclass jcls,jbyteArray jarg1){
jlong jresult=0;
有符号字符*arg1=(有符号字符*)0;
尺寸为arg2;
CL::分类器*结果=0;
(无效)杰诺夫;
(无效)jcls;
{
如果(jarg1){
arg1=(char*)jenv->GetByteArrayElements(jarg1,0);//此处错误:从“char*”到“signed char*”的转换无效
arg2=(大小)jenv->GetArrayLength