我的问题是,我有一个c++类在这里与第三方库(openCV)包括。我需要处理它,并在java应用程序中使用这个类,我想出了SWIG来包装在一起,以便在我的java代码中使用它。
它工作得很好,但我有一个问题,当它得到一个函数,我需要一个cv::Mat(矩阵数据类型在openCV)作为输入参数。请看下面的……
这是c++头信息:
class bridge
{
public:
cv::Mat IfindReciept(cv::Mat);
}
我的SWIG接口文件看起来像这样,为cv::Mat数据类型定义一个typemap:
%typemap(jstype) cv::Mat "org.opencv.core.Mat"
%typemap(jtype) cv::Mat "long"
%typemap(jni) cv::Mat "jlong"
%typemap(in) cv::Mat {
$1 = cv::Mat($input);
}
当我通过SWIG生成包装器时,我得到一个名为swigtype_p_cv__matt .java的文件,它定义了这样的数据类型:
public class SWIGTYPE_p_cv__Mat {
private long swigCPtr;
protected SWIGTYPE_p_cv__Mat(long cPtr, boolean futureUse) {
swigCPtr = cPtr;
}
protected SWIGTYPE_p_cv__Mat() {
swigCPtr = 0;
}
protected static long getCPtr(SWIGTYPE_p_cv__Mat obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}
根据SWIG文档,在SWIG无法识别类型时执行此操作。
我做错了什么?也许我疏忽了什么,因为我整晚都在做这件事。
Mevatron的回答对我不起作用。
希望有人能帮助我。
要在java中构建cv::Mat包装器,我做了以下操作:
%typemap(jstype) cv::Mat "org.opencv.core.Mat" // the C/C++ type cv::Mat corresponds to the JAVA type org.opencv.core.Mat (jstype: C++ type corresponds to JAVA type)
%typemap(javain) cv::Mat "$javainput.getNativeObjAddr()" // javain tells SWIG how to pass the JAVA object to the intermediary JNI class (e.g. swig_exampleJNI.java); see next step also
%typemap(jtype) cv::Mat "long" // the C/C++ type cv::Mat corresponds to the JAVA intermediary type long. JAVA intermediary types are used in the intermediary JNI class (e.g. swig_exampleJNI.java)
// the typemap for in specifies how to create the C/C++ object out of the datatype specified in jni
// this is C/C++ code which is injected in the C/C++ JNI function to create the cv::Mat for further processing in the C/C++ code
%typemap(in) cv::Mat {
$1 = **(cv::Mat **)&$input;
}
%typemap(javaout) cv::Mat {
return new org.opencv.core.Mat($jnicall);
}
你可以看到每一行的描述。这将允许您在java中传递并返回Mat对象。