2015-02-11 62 views
0

我試圖用jlong通過JNI函數傳遞一個Mat對象,但我在運行時得到此異常:通行證墊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); 
} 

我實現對C++來說是新的,異常是什麼意思?

回答

1

jlong未映射的對象,但long(對象被映射爲jobject)和Mat Java實例是從cv::Mat實例完全不同的,並且不能被鑄造這種方式。這裏常用的方法是在Java中使用long作爲C++中指針的近似值,並以您使用的方式進行轉換。

此外,這不是一個例外,而是由未捕獲的異常引起的崩潰。要獲得例外,您需要在C++代碼中使用try-catch。 C++異常與Java異常不兼容,所以你不能拋出C++並用Java捕獲它,反之亦然。

+0

謝謝,解決了通過長對象通過Mat.getNativeObjAddress() – 2015-02-11 10:05:23

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

,並請繞道指針,而不是引用。看到example

+0

你不能養活*指針*到CV ::墊balanceWhite() – berak 2015-02-11 08:52:21

+0

對不起,我猜他知道我的意思,他必須將mat指針轉換爲jlong​​ – cloudtex 2015-02-11 09:09:55

+0

愚蠢的問題 - 小C++經驗 - 爲什麼傳遞一個指針而不是引用? – WillC 2017-03-21 03:35:49