我是使用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);
答案 0 :(得分:2)
在java方面,你需要像这样定义native
方法:
public class DetectionBasedTracker {
public static native Mat[] nativeCreateObject(String name, int count);
}
您需要从java获取有关Mat
对象的信息并将新对象作为jobject
返回并将数组作为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 tabel
注意:这只是通过JNI创建Java对象的示例。仅使用JNI创建java对象的实例 - 这是一种不好的做法。