2015-02-11 6 views
0

Я пытаюсь передать Mat объект с помощью функции JNI с помощью jlong, но я получаю это исключение во время выполнения:Pass Мат для функции JNI - OpenCV

(__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); 
} 

I Является новым для C++, что означает это исключение?

ответ

1

jlong не отображение объекта, но long (объект отображается в jobject) и Java-экземпляр Mat полностью отличается от экземпляра cv::Mat и не может быть отлит таким образом. Обычный способ здесь - использовать long s в Java в качестве приближения указателей на C++ и использовать его так, как вы используете.

Кроме того, это не исключение, а авария, вызванная неперехваченным исключением. Чтобы получить исключение, вам нужно будет использовать try-catch в вашем коде на C++. Исключения C++ несовместимы с исключениями Java, поэтому вы не можете использовать C++ и перехватывать их на Java или наоборот.

+0

Спасибо, решенные проходя длинный объект через Mat.getNativeObjAddress() –

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

и передайте указатель вместо ссылки. см example

+0

вы не можете кормить * указатели * в ЦВ :: Mat к balanceWhite() – berak

+0

жаль, я предполагаю, что он знает, что я имею в виду, он должен конвертировать указатель мата в jlong ​​ – cloudtex

+0

Глупый вопрос - мало опыта на C++ - зачем передавать указатель, а не ссылку? – WillC

Смежные вопросы