2013-11-25 23 views
2

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


} 
+0

我的回答對你有幫助嗎? – manuell

+0

@manuell感謝您的幫助,我還沒有實施您的完整解決方案。我只做了一半,它工作正常(即我檢查,直到GetArrayLength,它給出了正確的結果)。我會盡快完成它併發布答案。 – Darshan

回答

3

你可以建立在Java中,長值的數組(所有Mat的getNativeObjAddr()結果)並調用傳遞數組的本機函數。

在JNI中,您可以使用GetArrayLength和GetLongArrayElements(它將返回一個jlong​​ *到第一個元素)來訪問所有long值。

完成後使用ReleaseLongArrayElements。

+0

你的建議正在工作,我已經更新了JNI中的代碼。非常感謝:-) – Darshan

+0

你很歡迎。本地func中的一些冗餘代碼(a_len和traindata)。我不知道C++ Mat是如何實現的,但是您是否打算讓Java端看到「需要的操作」?他們? – manuell

+0

雅,有少量冗餘線,我必須清理那些。目前它不需要操作在java端可見。如果必須的話,應該不會太困難。 – Darshan

相關問題