将 Mat 传递给 JNI 函数 - OpenCV

Pass Mat to JNI function - OpenCV

我正在尝试使用 jlong 通过 JNI 函数传递 Mat 对象,但我在运行时遇到此异常:

(__gnu_cxx::__verbose_terminate_handler()+276)
(__cxxabiv1::__terminate(void (*)())+8)
(std::terminate()+20)
(__cxa_throw+148)
(cv::error(cv::Exception const&)+80)
(cv::Mat::copySize(cv::Mat const&)+18)
(cv::Mat::Mat(cv::Mat const&)+122)
(cv::_InputArray::getMat(int) const+252)
(cv::split(cv::_InputArray const&, cv::_OutputArray const&)+20)
(cv::split(cv::Mat const&, std::vector<cv::Mat, std::allocator<cv::Mat> >&)+28)
(cv::xphoto::balanceWhite(cv::Mat const&, cv::Mat&, int, float, float, float, float)+54)
(Java_com_myapp_camera_CameraManager_simpleWhiteBalance+18)

原生函数是这样定义的

public native static void simpleWhiteBalance(Mat source, Mat dest);

实现方式如下

#include <jni.h>
#include <opencv2/core/core.hpp>
#include "opencv2/xphoto.hpp"
#include "simple_color_balance.cpp"
#include "com_myapp_camera_CameraManager.h"

JNIEXPORT void JNICALL Java_com_myapp_camera_CameraManager_simpleWhiteBalance
  (JNIEnv *, jclass, jlong in, jlong out) {

     cv::Mat& inMat = *(cv::Mat*)in;
     cv::Mat& outMat = *(cv::Mat*)out;

    cv::xphoto::balanceWhite(inMat, outMat, cv::xphoto::WHITE_BALANCE_SIMPLE);
}

我是 C++ 新手,异常是什么意思?

jlong 不是映射对象而是 long(对象被映射为 jobject)并且 Mat 的 Java 实例与实例完全不同cv::Mat 并且不能以这种方式施放。这里通常的方法是使用 Java 中的 longs 作为 C++ 中指针的近似值,并按照您使用的方式进行转换。

另外,这不是异常,而是未捕获异常导致的崩溃。要获得异常,您需要在 C++ 代码中使用 try - catch。 C++ 异常与 Java 异常不兼容,因此您不能抛出 C++ 并在 Java 中捕获它,反之亦然。

cv::Mat *inMat = (cv::Mat*)in;
cv::Mat *outMat = (cv::Mat*)out;

请传递 指针 而不是引用。见 example