2012-03-27 4 views
3

Ich habe es mit dem Parameter zu tun, der zwischen einer Android-Anwendung mit OpenCV und dem JNI übergeben wird. Mit den OpenCV-Bibliotheken in Java habe ich so etwas im Android-App-Code.Parameter übergeben zwischen Android und JNI

Android OpenCV Java-Code:

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-Code:

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; 
} 

Aber wenn ich versuche de Umwandlung von (Mat) bis (IplImage *) zu machen, in Der C-Code meiner App schlägt fehl. Meine Frage ist also, wie man ein CvRect- und ein Mat-Objekt von meinem Android-Java-Code an das JNI übergibt. Gibt es einen besseren Weg, dies zu tun?

Vielen Dank.

Antwort

1

Es scheint, dass es einen Unterschied zwischen dem Java Mat ist und der C Mat Objekt, aber Sie können die Adresse des nativen Mat Objekt, das Java-Objekt speichert Mat passieren. Ändern Sie Ihren Code auf die folgenden:

Android OpenCV Java-Code:

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

C-Code:

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

Scheint zu funktionieren, vielen Dank! – brachialste