Dar*_*han 4 java java-native-interface android opencv android-ndk
在Java方面,我有
List<Mat> arystrdimages = new ArrayList<Mat>();
随后,从外部目录中的文件夹读取的图像被添加到列表中
for(File f : strdimgs)
{
Mat tempimg = Highgui.imread(f.getAbsolutePath(), CvType.CV_8UC1);
arystrdimages.add(tempimg);
}
Run Code Online (Sandbox Code Playgroud)
在Native jni方面,我想通过它的引用访问arystrdimages.
对于单个mat对象,我们可以通过调用getNativeObjAddr 方法来实现,即在matc对象的opencv4android示例中,在本机端进行访问,如下所示
Java的
private Mat mRgba;
Run Code Online (Sandbox Code Playgroud)
打电话给本地人
CallNative(mRgba.getNativeObjAddr());
Run Code Online (Sandbox Code Playgroud)
在本土方面
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv *env, jobject thiz, jlong addrRgba1)
{
Mat& mRgb = *(Mat*)addrRgba1;
}
Run Code Online (Sandbox Code Playgroud)
如何为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);
Run Code Online (Sandbox Code Playgroud)
本土方面
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;
}
Run Code Online (Sandbox Code Playgroud)
您可以在Java中构建一个长值数组(所有Mat的getNativeObjAddr()结果)并调用传递数组的本机函数.
在JNI中,您可以使用GetArrayLength和GetLongArrayElements(将jlong*返回到第一个元素)访问所有长值.
完成后使用ReleaseLongArrayElements.