我的问题是我这里有一个C++类,其中包含一个第三方库(openCV)。我需要处理它并在Java应用程序中使用此类,然后我想到了SWIG将它们包装在一起,以便在我的Java代码中使用。

它工作得很好,但是当我需要一个cv::Mat(openCV中的矩阵数据类型)作为输入参数的函数时,我遇到了一个问题。看看以下...

这是我的c++ header 信息:

class bridge
{
  public:
      cv::Mat IfindReciept(cv::Mat);
}

我的SWIG接口(interface)文件如下所示,为cv::Mat数据类型定义了一个类型映射:
%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__Mat.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's answer对我不起作用。

希望可以有人帮帮我。

最佳答案

嗨,建立一个cv::Mat包装到Java我做了以下工作:

%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对象。

关于java - 用SWIG包装第三方类别/数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23696873/

10-14 16:17