2013-09-28 42 views
2

如何編寫我的C++ JNI函數,以便它將Mat數組返回給Java代碼? 我在Android環境下編程,在NDK的幫助下也使用了OpenCV的一些功能。如何將Mat數組從JNI返回給Java

我的C++函數是:

JNIEXPORT void JNICALL Java_com_micaela_myapp_MainActivity2_getFrames(JNIEnv* env, jobject object, jstring path) 
{ 
    const char *str; 
    str = env->GetStringUTFChars(path, NULL); 
    VideoCapture input_video; 
    if(input_video.open(str)){ 
     cout<<"Video File Opened"<<endl; 
    }else{ 
     cout<<"Video File Not Found"<<endl; 
    } 
    Mat image; 
    Mat frameBuffer[1000]; 
    int i=0; 
    while(input_video.read(image)==true){ 
     image.copyTo(frameBuffer[i]); 
     i++; 
    } 
} 

在Java中,我有:

static{ 
    System.loadLibrary("myapp"); 
} 
public static native void getFrames(String path); 

此功能現在返回void,並且工作正常。但是,我的目的是從它獲取數組frameBuffer,以便在Java中使用它。我怎樣才能做到這一點?

回答

0

一個解決方案是在Java中分配一個相同大小的數組,並將其傳遞給您的本地函數,並使用您的幀緩衝區單獨給對象充氣。有關將陣列傳遞給本機代碼的示例,請參閱this post,有關如何從本機代碼擴展Java Mat的方法,請參見this one

如果您確實需要使用本地代碼創建數組並返回它,請查看可通過JNI獲得的NewObjectArray方法。 (Example

+0

在Java中分配Mat數組並將其傳遞給getFrames()是個好主意。問題是我知道如何傳遞一個Mat,但我不知道如何將這些數組傳遞給本機代碼。在Java中,我必須傳遞一個Mat [N]對象,但是在cpp代碼中,我該如何讀取它? – user140888

+0

我的歉意 - 我發佈的第一個鏈接是錯誤的。我已經更新了我的答案。該鏈接有一個很好的例子來說明如何訪問Java數組。它不直接將數組傳遞給本地方法,而是使用'GetFieldID()'跨越邊界並訪問Java數組。 – acj

相關問題