Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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/6/cplusplus/128.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++库打包在java中(最终是Android)。我的库使用OpenCVMat和Size类作为输入。下面是我目前拥有的SWIG接口示例: %module customLib %include <std_vector.i> %include <std_string.i> %{ #include "opencv2/core/core.hpp" #include "../include/myinc/CustomLib.h" %} namespace cv { class Mat {}; class Size {}; } namespace myinc { CustomType preprocessMatrix(const cv::Mat& src, cv::Mat& dst, const cv::Size& ksize); } %模块自定义库 %包括 %包括 %{ #包括“opencv2/core/core.hpp” #包括“./include/myinc/CustomLib.h” %} 命名空间cv{ 类Mat{}; 班级规模{}; } 名称空间myinc{ 自定义类型预处理矩阵(常数cv::Mat&src、cv::Mat&dst、常数cv::Size&ksize); }_Java_C++_Opencv_Swig - Fatal编程技术网

使用SWIG引用外部库中的特定类 目前,我正在尝试将自定义的C++库打包在java中(最终是Android)。我的库使用OpenCVMat和Size类作为输入。下面是我目前拥有的SWIG接口示例: %module customLib %include <std_vector.i> %include <std_string.i> %{ #include "opencv2/core/core.hpp" #include "../include/myinc/CustomLib.h" %} namespace cv { class Mat {}; class Size {}; } namespace myinc { CustomType preprocessMatrix(const cv::Mat& src, cv::Mat& dst, const cv::Size& ksize); } %模块自定义库 %包括 %包括 %{ #包括“opencv2/core/core.hpp” #包括“./include/myinc/CustomLib.h” %} 命名空间cv{ 类Mat{}; 班级规模{}; } 名称空间myinc{ 自定义类型预处理矩阵(常数cv::Mat&src、cv::Mat&dst、常数cv::Size&ksize); }

使用SWIG引用外部库中的特定类 目前,我正在尝试将自定义的C++库打包在java中(最终是Android)。我的库使用OpenCVMat和Size类作为输入。下面是我目前拥有的SWIG接口示例: %module customLib %include <std_vector.i> %include <std_string.i> %{ #include "opencv2/core/core.hpp" #include "../include/myinc/CustomLib.h" %} namespace cv { class Mat {}; class Size {}; } namespace myinc { CustomType preprocessMatrix(const cv::Mat& src, cv::Mat& dst, const cv::Size& ksize); } %模块自定义库 %包括 %包括 %{ #包括“opencv2/core/core.hpp” #包括“./include/myinc/CustomLib.h” %} 命名空间cv{ 类Mat{}; 班级规模{}; } 名称空间myinc{ 自定义类型预处理矩阵(常数cv::Mat&src、cv::Mat&dst、常数cv::Size&ksize); },java,c++,opencv,swig,Java,C++,Opencv,Swig,OpenCV已经有了Mat和Size的Java包装器;我想知道,一旦我添加了OpenCV自己的Java框架,我在这里所做的是否会导致命名冲突。这是通过SWIG包含对外部库类的引用的正确方法吗?或者,有没有更好的方法来完成这类事情呢?我终于想出了这个办法!我花了一点时间才理解SWIG的Java类型映射系统是如何工作的(大多数示例都忽略了一些重要的概念) 如果其他人在理解如何编写Java类型映射时遇到困难,这里有一种方法可以帮助我。我认为从自顶向下的角度(即Java->intermediate JN

OpenCV已经有了
Mat
Size
的Java包装器;我想知道,一旦我添加了OpenCV自己的Java框架,我在这里所做的是否会导致命名冲突。这是通过SWIG包含对外部库类的引用的正确方法吗?或者,有没有更好的方法来完成这类事情呢?

我终于想出了这个办法!我花了一点时间才理解SWIG的Java类型映射系统是如何工作的(大多数示例都忽略了一些重要的概念)

如果其他人在理解如何编写Java类型映射时遇到困难,这里有一种方法可以帮助我。我认为从自顶向下的角度(即Java->intermediate JNI->JNI)查看类型映射是最容易的。首先,将
jstype
定义为希望在Java类中看到的类型(例如module_name.Java)。使用
javain
告诉SWIG如何将变量从Java类传递到中间JNI类(例如,module_nameJNI.Java)。接下来,将
jtype
定义为与
javain
相同的类型。例如,
$javainput.getNativeObjectAddr()
返回一个
长的
,因此这将成为我的
jtype
。最后,将
jni
定义为实际的jni函数将使用什么

下面是我为在OpenCV的Java界面上运行而提出的SWIG类型映射(从2.4.5开始):

    %typemap(jstype) cv::Mat& "org.opencv.core.Mat"
    %typemap(javain) cv::Mat& "$javainput.getNativeObjAddr()"
    %typemap(jtype) cv::Mat& "long"
    %typemap(jni) cv::Mat& "jlong"

    %typemap(in) cv::Mat& {
            $1 = *(cv::Mat **)&$input;
    }

    %typemap(jstype) cv::Size& "org.opencv.core.Size"
    %typemap(javain) cv::Size& "$javainput"
    %typemap(jtype) cv::Size& "org.opencv.core.Size"
    %typemap(jni) cv::Size& "jobject"

    %typemap(in) cv::Size& {
            jclass sizeClass = JCALL1(GetObjectClass, jenv, $input);
            jfieldID widthFieldId = JCALL3(GetFieldID, jenv, sizeClass, "width", "D");
            jfieldID heightFieldId = JCALL3(GetFieldID, jenv, sizeClass, "height", "D");
            double width = JCALL2(GetDoubleField, jenv, $input, widthFieldId);
            double height = JCALL2(GetDoubleField, jenv, $input, heightFieldId);
            $1 = new cv::Size((int)width, (int)height);
    }

    %typemap(freearg) cv::Size& {
            delete $1;
    }