Передайте массив матов в собственный код

Собственная функция, которую я хочу использовать, требует массив из 7 Mat s:

 static int nativeCode(cv::Mat &inputImg, cv::Mat bufImgs[7]); 

В jni_part меня есть:

 Mat& mRgba = *(Mat*)inRgba; Mat& bufImgs[7] = *(Mat*)inBufImgs; nativeCode(mRgba,bufImgs); 

В моем Java-коде я объявляю свои поля:

 private Mat mRgba; private Mat[] bufImgs = new Mat[7]; 

Я могу вызвать getNativeObjAddr на mRgba , но как сделать эквивалент для массива?

Некоторые предпосылки:

Я использую OpenCV, выполняя обработку изображения в реальном времени с помощью камеры. Функция, которую я вызываю для каждого кадра, требует дополнительных объектов. Чтобы предотвратить создание и уничтожение этих объектов в каждом фрейме, я хотел бы создать их один раз и просто передавать ссылки каждый раз.

Вам нужно преобразовать массив ссылок объектов Java в собственный массив cv::Mat . Поскольку у вас есть способ получить адрес родного объекта, это довольно просто. Вы создаете собственный метод со стороны java:

 public class MyClass { private Mat mRgba; private Mat[] bufImgs = new Mat[7]; // set the fields and all... // ... // Call the native method private native int callNativeCode(); } 

Затем на стороне C / C ++ вы реализуете callNativeCode следующим образом:

 JNIEXPORT jint JNICALL Java_MyClass_callNativeCode(::JNIEnv* env, jobject thisobject) { // Find the required classes jclass thisclass = env->GetObjectClass(thisobject); jclass matclass = env->FindClass("org/opencv/core/Mat"); // Get methods and fields jmethodID getPtrMethod = env->GetMethodID(matclass, "getNativeObjAddr", "()J"); jfieldID mrgbafieldid = env->GetFieldID(thisclass, "mRgba", "Lorg/opencv/core/Mat;"); jfieldID bufimgsfieldid = env->GetFieldID(thisclass, "bufImgs", "[Lorg/opencv/core/Mat;"); // Let's start: Get the fields jobject mrgba = env->GetObjectField(thisobject, mrgbafieldid); jobjectArray bufimgsArray = (jobjectArray)env->GetObjectField(thisobject, bufimgsfieldid); // Convert the array cv::Mat nativeBufImgs[7]; for (int i = 0; i < 7; i++) nativeBufImgs[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(bufimgsArray, i), getPtrMethod); // Get the address for mRgba cv::Mat* mrgbaptr = (cv::Mat*)env->CallLongMethod(mrgba, getPtrMethod); // We're done! Call the method and return! return nativeCode(mrgbaptr, nativeBufImgs); }