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

标签 android c++ opencv android-ndk

如何编写我的 C++ JNI 函数,以便它向 Java 代码返回一个 Mat 数组? 我在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 中使用它。我该怎么做?

最佳答案

一种解决方案是在 Java 中分配一个大小相等的数组,将其传递给您的原生 getFrames() 函数,并使用您的帧缓冲区单独膨胀 Mat 对象.请看this post有关将数组传递给 native 代码的示例,以及 this one寻找一种从原生的 Java Mat 中膨胀的方法。

如果您确实需要在 native 代码中创建数组并返回它,请查看可通过 JNI 获得的 NewObjectArray 方法。 ( Example )

关于android - 如何将 Mat 数组从 JNI 返回到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19067701/

相关文章:

java - 与 Android 中的 AsyncTask 相关

c++ - 为什么我的编译器不能识别 #include <thread> (c++)?

c++ - 使用递归的 C++ 中的数字模式函数

c++ - 从 C++ 使用 USB 端口

c++ - 类定义和调用有困难

opencv - 如何找出视频的帧率?

image-processing - OpenCV 在同一窗口中相邻显示 2 个图像

java - Android 中所有按钮的通用主题

java - 具有多个 Activity 和 fragment 的 Android Manifest 已严重损坏!我该如何修复它们?

android - 如何在 Play 控制台中退款测试订单(应用内购买)后删除权利