2013-04-15 19 views
6

La funzione nativa voglio usare richiede un array di 7 Mat s:passare un array di Mats in codice nativo

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

In jni_part ho:

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

Nel mio codice Java I 'm dichiarando i miei campi:

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

posso chiamare getNativeObjAddr su mRgba, ma ho w faccio a fare l'equivalente per l'array?

Alcuni retroscena:

Sto utilizzando OpenCV, facendo di elaborazione delle immagini in diretta con la fotocamera. La funzione che sto chiamando su ogni frame richiede alcuni oggetti extra. Per evitare di creare e distruggere questi oggetti su ogni frame, mi piacerebbe crearli una volta e passare semplicemente i riferimenti ogni volta.

risposta

5

È necessario convertire l'array di riferimenti a oggetti Java in una matrice nativa di cv::Mat. Dato che hai un metodo per ottenere l'indirizzo dell'oggetto nativo, è piuttosto semplice. Si crea un metodo nativo sul lato 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(); 
} 

Poi sul lato C/C++, si implementa callNativeCode in questo modo:

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); 
} 
+0

puoi spiegare la tua sintassi al 'GetFieldID (thisclass, "mRgba "," Lorg/opencv/core/Mat; ");' e 'GetFieldID (thisclass," bufImgs "," [Lorg/opencv/core/Mat; ");'. Cosa sono 'L' e' ['per? Lottando per trovare la documentazione per questo. – fredley

+1

@TomMedley I descrittori di classi in JNI appaiono sempre come 'L ;' (con le barre al posto dei punti, inoltre, non dimenticare il punto e virgola, si tratta di un errore comune). I descrittori di array sembrano '['. http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp16432 –

+0

Grazie, molto apprezzato. – fredley

Problemi correlati