2011-10-15 13 views
15

Java yerel işlevini kullanıyorum -vektörü C++/JNI'deki jobject'e dönüştürmek?

public native ArrayList<String> parseXML(); 

C++ benim yerel işlevim -

vector<string> resultList; 

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

Sorunum, resultList (vektör tipi) jobject türüne nasıl dönüştürülür?

+1

+1: Tahmin edebileceğinizden çok daha zor. ;) –

cevap

13

C++ 'da ArrayList için bir sarmalayıcı oluşturmanız gerekir. Bir şey gibi: Daha fazla bilgi için

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; 

bkz:

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

+3

Güzel cevap. Ama birisi java.util.List'yi uygulayan STL 'vector' için bir adaptör yazarsa, kesinlikle harika olurdu. Oldukça büyüleyici egzersiz! –

+0

Doğru! Çözümlerin çözümü bu olurdu. – Dyonisos

+2

Pardon benim pedantry, ama değil (char *) static_cast 'gereksiz? – moshbear

5

yöntemdir:

bool add(Object); 

Yani imzadır:

"(Ljava/lang/Object;)Z" 

Daha fazlası : 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

Bu, ilk cevabın neredeyse karakter karakterli bir kopyası gibi görünüyor. – moshbear

+3

@moshbear: değil. CallBooleanMethod' Burada 'CallVoidMethod''. Gerisi oldukça mekanik, bu yüzden benzerlikler bekleniyor. – Mat

+3

Yeterince adil. Önceki cevap hakkında yorumum w.r.t. Ancak (char *) static_cast 'hala yedekte duruyor. – moshbear