如何通过一个ArrayList的&LT;&垫GT;从Java到OpenCV的机端(NDK)为Android [英] How to pass a ArrayList<Mat> from Java to native side(NDK) in opencv for android
问题描述
在Java方面我有
列表&LT;&垫GT; arystrdimages =新的ArrayList&LT;&垫GT;();
随后从在外部目录的文件夹读出的图像被添加到列表
的(文件f:strdimgs)
{ 垫tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1); arystrdimages.add(tempimg);
}
在本机JNI边我想通过它的引用来访问arystrdimages。
对于单个垫目标,我们可以通过调用 getNativeObjAddr
的方法,即在一个垫opencv4android示例对象在本机端的访问做如下图所示<做到这一点/ p>
Java的
私人垫mRgba;
调用本机端
CallNative(mRgba.getNativeObjAddr());
在本机端
JNIEXPORT无效JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv的*,jobject,jlong addrRgba1){ 垫&安培; mRgb = *(*垫)addrRgba1;}
如何为列表&LT做到这一点;垫&GT;
对象
编辑:您的建议的解决方案的实施
块引用>Java端
INT elems = arystrdimages.size();
Log.v(Matobjdata,Matobject数读=+ elems);
//Log.v(\"Matobjdata,从天然=+ ANS);
长[] = tempobjadr新长[elems]
的for(int i = 0; I&LT; elems;我++)
{
垫tempaddr = arystrdimages.elementAt(I)
tempobjadr [I] = tempaddr.getNativeObjAddr();
} Log.v(Matobjdata,addresselementsinlong arrray =+ tempobjadr.length);
INT ANS = TrainDescriptors(tempobjadr); //调用本地函数
Log.v(Matobjdata,从天然=+ ANS);本机端
JNIEXPORT jint JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_TrainDescriptors(JNIEnv的* ENV,jobject trainobject,jlongArray traindataaddr)
{矢量&lt;&垫GT; trainimgs;
jsize a_len = env-&GT; GetArrayLength(traindataaddr);
jlong * traindata = env-&GT; GetLongArrayElements(traindataaddr,0);对于(INT K = 0; K&LT; a_len; k ++)
{
垫&安培; newimage = *(*垫)traindata [K];
trainimgs.push_back(newimage);
}
//做图像所需要的操作;
env-&GT; ReleaseLongArrayElements(traindataaddr,traindata,0); 返回a_len;
}
解决方案您可以建立在Java中,长值数组(getNativeObjAddr()的所有垫的结果),并调用传递数组本机的功能。
在JNI,可以用GetArrayLength和GetLongArrayElements(返回jlong *的第一个元素)访问所有的长期价值。
使用ReleaseLongArrayElements时完成的。
In Java side i have
List<Mat> arystrdimages = new ArrayList<Mat>();
subsequently the images read from a folder in external directory are added into the list
for(File f:strdimgs) { Mat tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1); arystrdimages.add(tempimg ); }
In Native jni side i want to access arystrdimages by its reference.
For a single mat object, we can do it by calling
getNativeObjAddr
method, i.e in opencv4android examples for a Mat object the accessing in native side is done as shown belowJava
private Mat mRgba;
call to native side
CallNative(mRgba.getNativeObjAddr());
In Native side
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv*, jobject, jlong addrRgba1){ Mat& mRgb = *(Mat*)addrRgba1; }
How to do this for
List<Mat>
objects?.EDIT: Implementation of your suggested solution
Java side
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);
Native side
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; }
解决方案You could build, in Java, an array of long values (getNativeObjAddr() results for all the Mat) and call a native function passing the array.
In JNI, you could access all the long values with GetArrayLength and GetLongArrayElements (which returns a jlong* to the first element).
Use ReleaseLongArrayElements when done.
这篇关于如何通过一个ArrayList的&LT;&垫GT;从Java到OpenCV的机端(NDK)为Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!