2011-10-15 67 views
15

我使用Java本機功能 -將矢量轉換爲C++/JNI中的jobject?

public native ArrayList<String> parseXML(); 

在C++我的本地函數 -

vector<string> resultList; 

JNIEXPORT jobject JNICALL Java_Sample1_parseXML 
(JNIEnv *env, jobject obj){ 
    // logic 
    return resultList; // here getting error 
} 

我的問題是,如何轉換resultList(矢量型),以jobject類型?

+1

+1:它比你想象的要難得多。 ;) –

回答

13

您將不得不爲C++中的ArrayList創建一個包裝器。喜歡的東西:

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 

for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 

    jstring _str = (*env).NewStringUTF(str); 

    (*env).CallVoidMethod(object, (*env).GetMethodID(clazz, "add", "(java/lang/Object)V"), _str); 

} 

return obj; 

瞭解更多信息,請參閱:

http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html

+3

很好的答案。但是,如果有人爲STL'vector'編寫一個適配器來實現'java.util.List',那將會非常棒。非常有趣的練習! –

+0

對!這將是解決方案的解決方案。 – Dyonisos

+2

請原諒我的貞操,但不是'(char *)static_cast '多餘? – moshbear

5

的方法是:

bool add(Object); 

所以簽名是:

"(Ljava/lang/Object;)Z" 

更多的:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp276

vector <char*> vec; 

jclass clazz = (*env).FindClass("java/util/ArrayList"); 
jobject obj = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "<init>", "()V")); 
for (int n=0;n<vec.size();n++) 
{ 
    char* str = (char*) static_cast<char*>(vec[n]); 
    jstring _str = (*env).NewStringUTF(str); 
    (*env).CallBooleanMethod(object, (*env).GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str); 
} 
return obj; 
+2

這看起來像是第一個答案的幾乎逐個字符的副本。 – moshbear

+3

@moshbear:不是。 'CallBooleanMethod'在這裏,'CallVoidMethod'在那裏。其餘的是相當機械的,所以預計會有相似之處。 – Mat

+3

夠公平的。我對先前的回答w.r.t的評論'(char *)static_cast 儘管如此,多餘的東西依然存在。 – moshbear