繁体   English   中英

将Mat对象的数组返回给Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM