如何通过一个ArrayList的<&垫GT;从Java到OpenCV的机端(NDK)为Android [英] How to pass a ArrayList<Mat> from Java to native side(NDK) in opencv for android

查看:138
本文介绍了如何通过一个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示例对象在本机端的访问做如下图所示<做到这一点/ 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,jlong​​Array 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 below

Java

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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆