Передача параметров между Android и JNI - PullRequest
3 голосов
/ 28 марта 2012

Я имею дело с передачей параметров между приложением Android с OpenCV и JNI. Использование библиотек OpenCV в Java У меня есть что-то подобное в коде приложения Android.

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, мое приложение не работает. Поэтому мой вопрос о том, как передать объект CvRect и Mat из моего Java-кода Android в JNI. Есть ли лучший способ сделать это?

Большое спасибо.

1 Ответ

1 голос
/ 29 апреля 2014

Кажется, что есть разница между Java Mat и объектом C Mat, но вы можете передать адрес нативного Mat объекта, который хранит ваш объект Java Mat.Измените свой код на следующий:

Android OpenCV Java Code:

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