[英]Return array of Mat object to Java
我是Android的opencv的新手。 我想从JNI中获取Mat对象数组。 我创建了一个应用程序,将一些Mat对象从Java发送到JNI。 我可以从JNI返回int,long和其他类型。 我将如何返回Mat对象或Mat对象数组? 在此示例中,它返回一个长对象
JNIEXPORT jlong JNICALL
Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject
(JNIEnv *, jclass, jstring, jint);
在Java方面,您需要定义如下本native
方法:
public class DetectionBasedTracker {
public static native Mat[] nativeCreateObject(String name, int count);
}
您需要从java中获取有关Mat
对象的信息,并将新对象作为jobject
返回,并将array作为jobjectArray
返回:
JNIEXPORT jobjectArray JNICALL
Java_org_opencv_samples_fd_DetectionBasedTracker_nativeCreateObject
(JNIEnv *env, jclass cls, jstring str, jint count){
// cls argument - is DetectionBasedTracker.class
// take class info
jclass matCls = env->FindClass("your/package/Mat");
if (env->ExceptionOccurred())
return NULL;
// take constructor by signature
const char* constructorSignature = "(Ljava/lang/String;)V";
jmethodID constructor = env->GetMethodID(matCls, "<init>", constructorSignature);
if (env->ExceptionOccurred())
return NULL;
// create java objects array
jobjectArray matArray = env->NewObjectArray((jsize)count, matCls, NULL);
for(jsize i = 0; i < count; i++){
// create new object
jobject mat = env->NewObject(matCls, constructor, /* constructor args */ str);
// put object into array
env->SetObjectArrayElement(matArray , i, mat);
}
return matArray;
}
要了解有关constructorSignature
参数的更多信息,请查看Java VM Type Signatures表格。
注意 :这只是通过JNI创建Java对象的示例。 仅将JNI用于创建Java对象的实例-这是一种不好的做法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.