在Java方面我有如何從Java OpenCV中傳遞的ArrayList <Mat>到本機端(NDK)爲Android
List<Mat> arystrdimages = new ArrayList<Mat>();
隨後從外部目錄中的文件夾中讀取圖像添加到列表
for(File f:strdimgs)
{
Mat tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1);
arystrdimages.add(tempimg);
}
在原生jni方面我想通過它的參考訪問arystrdimages。
對於單個墊對象,我們可以通過調用getNativeObjAddr
方法做到這一點,即,在用於墊opencv4android實例對象中天然側的訪問被如下所示
爪哇
private Mat mRgba;
呼叫完成到本機端
CallNative(mRgba.getNativeObjAddr());
在本機端
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv*, jobject, jlong addrRgba1){
Mat& mRgb = *(Mat*)addrRgba1;
}
如何做到這一點爲List<Mat>
對象?
編輯:你所建議的解決方案
Java方面
int elems= arystrdimages.size();
Log.v("Matobjdata", "number of Matobject read = " + elems);
//Log.v("Matobjdata", "from native = " + ans);
long[] tempobjadr = new long[elems];
for (int i=0;i<elems;i++)
{
Mat tempaddr=arystrdimages.elementAt(i);
tempobjadr[i]= tempaddr.getNativeObjAddr();
}
Log.v("Matobjdata", "addresselementsinlong arrray = " + tempobjadr.length);
int ans = TrainDescriptors(tempobjadr);//call to native function
Log.v("Matobjdata", "from native = " + ans);
機端的實現
JNIEXPORT jint JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_TrainDescriptors(JNIEnv * env, jobject trainobject,jlongArray traindataaddr)
{
vector<Mat> trainimgs;
jsize a_len = env->GetArrayLength(traindataaddr);
jlong *traindata = env->GetLongArrayElements(traindataaddr,0);
for(int k=0;k<a_len;k++)
{
Mat & newimage=*(Mat*)traindata[k];
trainimgs.push_back(newimage);
}
// do the required manipulation on the images;
env->ReleaseLongArrayElements(traindataaddr,traindata,0);
return a_len;
}
我的回答對你有幫助嗎? – manuell
@manuell感謝您的幫助,我還沒有實施您的完整解決方案。我只做了一半,它工作正常(即我檢查,直到GetArrayLength,它給出了正確的結果)。我會盡快完成它併發布答案。 – Darshan