2011-10-15 14 views
15

estoy usando Java función nativa -convertir vector a jobject en C++/JNI?

public native ArrayList<String> parseXML(); 

En C++ mi función nativa -

vector<string> resultList; 

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

Mi problema es que la forma de convertir resultList (tipo vectorial) a jobject tipo?

+1

+1: Es mucho más difícil de lo que puedas imaginar. ;) –

Respuesta

13

Debería crear un contenedor para ArrayList en C++. Algo así como:

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; 

Para más información ver:

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

+3

Buena respuesta. Pero sería absolutamente genial, si alguien escribe un adaptador para el 'vector' de STL que implementa' java.util.List'. Ejercicio bastante fascinante! –

+0

¡Correcto! Esta sería la solución de las soluciones. – Dyonisos

+2

Disculpe mi pedantería, pero no es '(char *) static_cast ' redundante? – moshbear

5

El método es:

bool add(Object); 

Así que la firma es:

"(Ljava/lang/Object;)Z" 

Más contenido en : 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

Esto parece una copia casi carácter por carácter de la primera respuesta. – moshbear

+3

@moshbear: no lo es. 'CallBooleanMethod' aquí,' CallVoidMethod' allí. El resto es bastante mecánico, por lo que se esperan similitudes. – Mat

+3

Bastante justo. Mi comentario sobre la respuesta anterior w.r.t. '(char *) static_cast ' siendo redundante sigue en pie, sin embargo. – moshbear

Cuestiones relacionadas