Возвращаемый объект Mat из собственного кода в java в OpenCV

У меня Android-приложение OpenCV. Большая часть его кода находится на Java, но у меня есть одна функция, которая находится в C. Функция получает объект Mat и возвращает новую.

Мой вопрос: как вернуть Mat из собственного кода в Java? Не удалось найти ни одного примера этого.

Благодарю.

Сегодня мне пришлось вернуть Mat из собственного кода. Я начал с «Tutorial 2 Advanced – 2. Mix Java + Native OpenCV», он уже передает два Mat (изображения, снятые с камеры) в собственный код. Но я хотел вернуть извлеченную функцию, поэтому я добавил jlong addrDescriptor в подпись:

 extern "C" { JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv* env, jobject thiz, jlong addrGray, jlong addrRgba, jlong addrDescriptor) { Mat* pMatGr=(Mat*)addrGray; Mat* pMatRgb=(Mat*)addrRgba; Mat* pMatDesc=(Mat*)addrDescriptor; vector<KeyPoint> v; //OrbFeatureDetector detector(50); OrbFeatureDetector detector; OrbDescriptorExtractor extractor; detector.detect(*pMatGr, v); extractor.compute( *pMatGr, v, *pMatDesc ); circle(*pMatRgb, Point(100,100), 10, Scalar(5,128,255,255)); for( size_t i = 0; i < v.size(); i++ ) { circle(*pMatRgb, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(255,128,0,255)); } } } 

В java-части я добавил Mat

 private Mat descriptor; descriptor = new Mat(); 

Метод getNativeObjAddr() делает трюк. Мать выделяется в java и его адрес передается в собственный код, поэтому нет явного возвращения.

 FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr(), descriptor.getNativeObjAddr()); Log.i("desc:" , descriptor.dump()); 

Mat был заполнен необходимыми данными и непосредственно доступен в java-коде после возвращения JNI-запроса.

Где-то еще в коде выпущен Mat:

 if ( descriptor != null) descriptor.release(); descriptor = null;