Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to pass a ArrayList<Mat> from Java to native side(NDK) in opencv for android
    text
    copied!<p>In Java side i have</p> <p><code>List&lt;Mat&gt; arystrdimages = new ArrayList&lt;Mat&gt;(); </code></p> <p>subsequently the images read from a folder in external directory are added into the list </p> <pre><code>for(File f:strdimgs) { Mat tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1); arystrdimages.add(tempimg ); } </code></pre> <p>In Native jni side i want to access arystrdimages by its reference.</p> <p>For a single mat object, we can do it by calling <code>getNativeObjAddr</code> method, i.e in opencv4android examples for a Mat object the accessing in native side is done as shown below</p> <p>Java</p> <pre><code>private Mat mRgba; </code></pre> <p>call to native side</p> <pre><code>CallNative(mRgba.getNativeObjAddr()); </code></pre> <p>In Native side</p> <pre><code> JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv*, jobject, jlong addrRgba1){ Mat&amp; mRgb = *(Mat*)addrRgba1; } </code></pre> <p>How to do this for <code>List&lt;Mat&gt;</code> objects?.</p> <blockquote> <p>EDIT: Implementation of your suggested solution</p> </blockquote> <p>Java side</p> <pre><code>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&lt;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); </code></pre> <p>Native side</p> <pre><code>JNIEXPORT jint JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_TrainDescriptors(JNIEnv * env, jobject trainobject,jlongArray traindataaddr) { vector&lt;Mat&gt; trainimgs; jsize a_len = env-&gt;GetArrayLength(traindataaddr); jlong *traindata = env-&gt;GetLongArrayElements(traindataaddr,0); for(int k=0;k&lt;a_len;k++) { Mat &amp; newimage=*(Mat*)traindata[k]; trainimgs.push_back(newimage); } // do the required manipulation on the images; env-&gt;ReleaseLongArrayElements(traindataaddr,traindata,0); return a_len; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload