本文介绍了如何通过一个ArrayList的<&垫GT;从Java到OpenCV的机端(NDK)为Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Java方面我有

列表<&垫GT; arystrdimages =新的ArrayList<&垫GT;();

随后从在外部目录的文件夹读出的图像被添加到列表

 的(文件f:strdimgs)
        {        垫tempimg = Highgui.imread(f.getAbsolutePath(),CvType.CV_8UC1);        arystrdimages.add(tempimg);
        }

在本机JNI边我想通过它的引用来访问arystrdimages。

对于单个垫目标,我们可以通过调用 getNativeObjAddr 的方法,即在一个垫opencv4android示例对象在本机端的访问做如下图所示

Java的

 私人垫mRgba;

调用本机端

  CallNative(mRgba.getNativeObjAddr());

在本机端

  JNIEXPORT无效JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv的*,jobject,jlong​​ addrRgba1){ 垫&安培; mRgb = *(*垫)addrRgba1;}

如何为列表&LT做到这一点;垫> 对象

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 19:00