首先我是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”);
所以请指导我。或任何其他解决方案将不胜感激
答案 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。
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;