如何将Mat的数组从JNI返回到Java

时间:2013-09-28 13:50:16

标签: android c++ opencv android-ndk

如何编写我的c ++ JNI函数,以便它返回一个Mat到Java代码的数组? 我在Android环境下编程,在NDK的帮助下也使用了OpenCV的一些功能。

我的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中使用它。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

一种解决方案是在Java中分配相同大小的数组,将其传递给本机getFrames()函数,并使用帧缓冲区单独膨胀Mat个对象。有关将数组传递给本机代码的示例,请参阅this post;有关从本地代码中扩展Java Mat的方法,请参阅this one

如果您确实需要在本机代码中创建数组并将其返回,请查看通过JNI提供的NewObjectArray方法。 (Example