将Mat对象的数组返回给Java

时间:2017-05-17 21:01:31

标签: java android opencv java-native-interface

我是使用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);

1 个答案:

答案 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对象的实例 - 这是一种不好的做法。