用SWIG包装第三方类/数据类型



我的问题是,我有一个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对象。

相关内容

  • 没有找到相关文章

最新更新