将数组从Mat返回到java

时间:2015-02-19 06:33:12

标签: opencv android-ndk java-native-interface

首先我是Stackoverflow的新用户我是SORY,因为这个问题有任何错误。我尽了最大努力,但没有解决我的问题,请指导。

在问这个问题之前,我已经搜索了很多,但还没有找到答案。我有一个c ++代码,我在那里进行一些图像处理,并在输出上获得2个2d数组和1个1d数组(String [] [],int [] [],Mat [])。我完成了将String和int数组返回给java,但无法将Mat []返回给java。要将Mat []数组返回到java,我现在所做的就是下面给出的。

jclass cls = env->FindClass("org/opencv/core/Mat");
jmethodID jMatCons = env->GetMethodID(cls,"<init>","()V");

// Call back constructor to allocate a new instance
jobjectArray newMatArr = env->NewObjectArray(appWords.size(), cls, 0);
jobject jMat = env->NewObject(cls, jMatCons);

for (int k=0; k< appWords.size(); k++){
    env->SetObjectArrayElement(newMatArr, k, jMat);
 //   nativeBufImgs[k] = appWords[k];
}

上面粘贴的代码将Mat []数组返回给java但是为空。为了解决我的问题,我检查了这些问题 how to return array of Mat from JNI to Java但它没有解决我的问题。 我也为我的Mat []问题复制了此链接,但没有水果Getting keypoint back from native code 在上面的代码pasetd中,我认为问题是我没有把Mat的方法签名放在这一行

jmethodID jMatCons = env-&gt; GetMethodID(cls,“”,“()V”);

所以请指导我。或任何其他解决方案将不胜感激

2 个答案:

答案 0 :(得分:1)

检查this。它对我有用。

从Java中,您创建一个Mat对象并将其作为指针传递。

Mat mat_object = new Mat();
nativeFunction(mat_object.getNativeObjAddr());

从C ++中,您将指针强制转换为cv :: Mat。

cv::Mat& mat_object  = *(cv::Mat*) mat_pointer;

// do something with the mat

答案 1 :(得分:0)

我有点晚了。但是,以下代码显示了如何在C ++中创建Mat数组并将其返回给java。

&#13;
&#13;
JNIEXPORT jobjectArray JNICALL Java_de_dsi_decoder_Helper_processFrame (JNIEnv * env, jobject)
{
vector<Mat> images=fill_images();//fill it with your Mats
//copy from native to java

    jclass matclass = env->FindClass("org/opencv/core/Mat");
    jmethodID jMatCons = env->GetMethodID(matclass,"<init>","()V");
    jmethodID getPtrMethod = env->GetMethodID(matclass, "getNativeObjAddr", "()J");

    // Call back constructor to allocate a new instance
    jobjectArray newMatArr = env->NewObjectArray(images.size(), matclass, 0);


    for (int i=0; i< images.size(); i++){
        jobject jMat = env->NewObject(matclass, jMatCons);
        Mat & native_image= *(Mat*)env->CallLongMethod(jMat, getPtrMethod);
        native_image=images[i];

        env->SetObjectArrayElement(newMatArr, i, jMat);
    }

    return newMatArr;
}
&#13;
&#13;
&#13;