Opencv 将Mat数组从jni返回到java

Opencv 将Mat数组从jni返回到java,opencv,android-ndk,java-native-interface,Opencv,Android Ndk,Java Native Interface,首先,我是Stackoverflow的新用户,我对这个问题中的任何错误感到抱歉。我已经尽力了,但还没有解决我的问题,请指点 在问这个问题之前,我已经搜索了很多,但还没有找到答案。我有一个C++代码,我在这里做一些图像处理,在输出上得到2个2D数组和1个1D数组(String [][],INT[][MAT])。我已经完成了将字符串和int数组返回到java的操作,但无法将Mat[]返回到java。要将Mat[]数组返回到java,下面给出了我所做的工作 jclass cls = env->F

首先,我是Stackoverflow的新用户,我对这个问题中的任何错误感到抱歉。我已经尽力了,但还没有解决我的问题,请指点

在问这个问题之前,我已经搜索了很多,但还没有找到答案。我有一个C++代码,我在这里做一些图像处理,在输出上得到2个2D数组和1个1D数组(String [][],INT[][MAT])。我已经完成了将字符串和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];
}
jclass cls=env->FindClass(“org/opencv/core/Mat”);
jmethodID jMatCons=env->GetMethodID(cls,“,”()V”);
//回调构造函数以分配新实例
jobjectArray newMatArr=env->NewObjectArray(appWords.size(),cls,0);
jobject jMat=env->NewObject(cls、jMatCons);
for(int k=0;kSetObjectArrayElement(newMatArr、k、jMat);
//nativeBufImgs[k]=appWords[k];
}
上面粘贴的代码将Mat[]数组返回给java,但为空。为了解决我的问题,我检查了这些问题 但这并没有解决我的问题。 我也为我的Mat[]问题复制了此链接,但没有结果 在上面的代码pasetd中,我认为问题在于我没有将Mat的方法签名放在这一行

jmethodID jMatCons=env->GetMethodID(cls,“,”()V”)

所以请引导我做这件事。或任何其他解决方案将不胜感激

检查。这对我有用

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

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

从C++中,您将指针转换为CV::Mat .<

cv::Mat&Mat_object=*(cv::Mat*)Mat_指针;
//用垫子做点什么

我有点晚了。但是,下面的代码演示了如何在C++中创建Mat数组并将其返回到java。
JNIEXPORT jobjectArray JNICALL Java_de_dsi_decoder_Helper_processFrame(JNIEnv*env,jobject)
{
向量图像=填充_图像();//用垫子填充
//从本机复制到java
jclass matclass=env->FindClass(“org/opencv/core/Mat”);
jmethodID jMatCons=env->GetMethodID(matclass,“,”()V”);
jmethodID getPtrMethod=env->GetMethodID(matclass,“getNativeObjAddr”和“()J”);
//回调构造函数以分配新实例
jobjectArray newMatArr=env->NewObjectArray(images.size(),matclass,0);
对于(int i=0;iNewObject(matclass,jMatCons);
Mat&native_image=*(Mat*)env->CallLongMethod(jMat,getPtrMethod);
原生图像=图像[i];
env->SetObjectArrayElement(newMatArr,i,jMat);
}
返回newMatArr;
}