2013-05-10 30 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的公開此方法只是樣病例這個。 (我會鏈接到文檔的頁面,但網站不在這裏加載,對不起。)