2013-05-10 69 views
0

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

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

在Java中我调用该方法是这样的:

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

在CPP文件,我需要得到垫目标。获得字符串很简单!但我怎么能得到类似于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; 

}

回答

3

一个java Mat对象是一个完全不同的事情从本地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的细节

0

我算是今年年底党的值,或调用方法,但是你的方式传递一个Mat到C是一个jlong​​与Java的地毯垫。你可以做这样的事情:

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的公开此方法只是样病例这个。 (我会链接到文档的页面,但网站不在这里加载,对不起。)