2012-03-27 151 views
3

我正在處理Android應用程序與OpenCV和JNI之間傳遞的參數。在Java中使用OpenCV庫我在Android應用程序代碼中使用了類似的東西。Android和JNI之間的參數傳遞

的Android OpenCV的Java代碼:

Mat mat; //Mat object with data 
Rect rect; //Rect object with data 

//call to the native function 
int resProc = Native.processImages_native(rect, mat); 

C代碼:

JNIEXPORT jint JNICALL Java_com_test_Native_processImages_1native 
(JNIEnv*, jclass, CvRect, Mat); 

... 

jint Java_com_test_Native_processImages_1native 
(JNIEnv* env, jclass jc, CvRect rect, Mat mat){ 
    int res = processImages(rect, mat); 
    return (jint)res; 
} 

... 

int processImages(CvRect rect, Mat mat) 
{    
    IplImage *ipl_Img = &mat.operator IplImage(); // here FAILS 
    CvRect rect_value = rect; 
} 

但是,當我試圖讓從(MAT)去轉換(IplImage結構*)在C代碼我的應用程序失敗。所以我的問題是關於如何將Android Java代碼中的CvRect和Mat對象傳遞給JNI。有一個更好的方法嗎?

非常感謝。

回答

1

似乎有是Java Mat以及C Mat對象之間的差異,但你可以通過本機Mat對象的Java Mat對象存儲的地址。你的代碼更改爲以下:

的Android OpenCV的Java代碼:

//call to the native function 
int resProc = Native.processImages_native(rect, mat.getNativeObjAddr()); 

C代碼:

jint Java_com_test_Native_processImages_1native 
(JNIEnv* env, jclass jc, CvRect rect, jlong mat){ 
    int res = processImages(rect, *((Mat*)mat)); 
    return (jint)res; 
} 
+0

似乎工作,非常感謝! – brachialste 2014-10-02 20:48:17