1

我想知道如何将自定义对象从 Java 获取到 C++?

我需要在 C++ 中实现一个方法来获得性能。我已经有了在java中工作的方法,但我想移植到c++。

在 Java 上,我调用这样的方法:

private native boolean P(Mat Previous, String Name);

在 CPP 文件上,我需要获取 mat 对象。获取字符串很容易!但是如何获得类似于 c++(cv::Mat) 的自定义 mat 对象?我需要将 java Mat 放入 cv::Mat 中。这里是cpp文件:

JNIEXPORT bool JNICALL Java_br_raphael_detector_SimpsonDetector_P
                      (JNIEnv* env,jobject thiz, jobject Previous, jstring Name){
jboolean sim = false;

const char* N = env->GetStringUTFChars(Name,0);
std::string Nome = N;


//Release
env->ReleaseStringUTFChars(Name,N);

//Then Return
return sim;

}

4

2 回答 2

3

javaMat对象与 native完全不同cv::Mat,您不能直接从另一个对象获取。

也就是说,如果你知道里面有哪些字段Mat,并且知道里面对应的字段cv::Mat,你就可以编写一个转换函数,将字段的内容一一复制。

// First get the Mat class
jclass Mat = (*env)->GetObjectClass(env, Previous);

// To get a field
jfieldId field = (*env)->GetFieldID(env, Mat, "fieldName", field type);

// To get a method
jmethodId method = (*env)->GetMethodID(env, Mat, "methodName", method signature);

从那里您可以读取字段的值,或调用方法

// getting a field
(*env)->GetObjectField(env, Previous, field);

// calling a method
(*env)->CallObjectMethod(env, Previous, method, parameters);

有关详细信息,请参阅http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

于 2013-05-10T05:25:11.943 回答
0

我迟到了一年,但是您将 Mat 传递给 C 的方式是使用带有 Java Mat 地址的 jlong​​。你可以这样做:

private static native boolean P(long matAddress, String name);

在 C 中:

JNIEXPORT jboolean JNICALL Java_br_raphael_detector_SimpsonDetector_P
                  (JNIEnv* env,jobject thiz, jlong matAddress, jstring Name)
{  
    cv::Mat* image = (cv::Mat*)matAddress;
    // Do stuff with image.
}

然后你会像这样调用Java中的方法:

P(myMat.getNativeObjAddr(), name);

OpenCV 仅针对此类情况公开此方法。(我会链接到文档页面,但该网站未在此处加载,抱歉。)

于 2014-11-12T17:49:55.120 回答