【问题标题】:Return array of Mat from jni to java从 jni 返回 Mat 数组到 java
【发布时间】:2015-02-19 06:33:11
【问题描述】:

首先,我是 Stackoverflow 的新用户,对于这个问题中的任何错误,我深表歉意。我已经尽力了,但还没有解决我的问题,请指导。

在问这个问题之前我已经搜索了很多,但没有找到答案。我有一个 c++ 代码,我在其中进行一些图像处理并在输出(String[][]、int[][]、Mat[])上获得 2 个二维数组和 1 个 1 维数组。我已完成将 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 在上面的代码中,我认为问题是我没有将 Mat 的方法签名放在这一行中

jmethodID jMatCons = env->GetMethodID(cls,"","()V");

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我来晚了。但是,下面的代码展示了如何在 C++ 中创建 Mat 数组并将其返回给 java。

      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;
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2012-01-11
        • 2011-09-02
        • 1970-01-01
        • 2019-11-28
        • 2018-01-19
        相关资源
        最近更新 更多