gpt4 book ai didi

java - 如何在 opencv for android 中将 ArrayList 从 Java 传递到 native 端(NDK)

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:00 25 4
gpt4 key购买 nike

在 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 示例中, native 端的访问如下所示完成

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> 执行此操作对象?

EDIT: Implementation of your suggested solution

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);

native 端

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() 结果)并调用传递该数组的 native 函数。

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

完成后使用 ReleaseLongArrayElements。

关于java - 如何在 opencv for android 中将 ArrayList<Mat> 从 Java 传递到 native 端(NDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com