如何在<Mat> opencv for android 中将 ArrayList 从 Java 传递到本机端 (NDK)



在Java端,我有

List<Mat> arystrdimages = new ArrayList<Mat>();

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

for(File f : strdimgs)
{       
    Mat tempimg = Highgui.imread(f.getAbsolutePath(), CvType.CV_8UC1);
    arystrdimages.add(tempimg);
}

在Native jni端,我想通过引用来访问arystrdimages。

对于单个Mat对象,我们可以通过调用getNativeObjAddr方法来实现,即在Mat对象的opencv4android示例中,本地端的访问如下所示

Java

private Mat mRgba;

调用本机端

CallNative(mRgba.getNativeObjAddr());

在本机端中

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv *env, jobject thiz, 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;
}

您可以在Java中构建一个长值数组(所有Mat的getNativeObjAddr()结果),并调用传递该数组的本机函数。

在JNI中,您可以使用GetArrayLength和GetLongArrayElements(向第一个元素返回jlong*)访问所有的long值。

完成后使用ReleaseLongArrayElements。

最新更新