2011-04-29 9 views
14

Me gustaría devolver una matriz de cadenas de C a Java utilizando JNI. vi que podía usar NewObjectArray() esta manera:JNI: cree un workjectArray sin saber el tamaño por adelantado

JNIEXPORT jobjectArray JNICALL Java_Array_initStringArray(JNIEnv *env, jclass cls, jint size) 
{ 
jclass stringCls = (*env)->FindClass(env, "Ljava/lang/String;"); 
if (stringCls == NULL) return NULL; 

jstringArray result = (*env)->NewObjectArray(env, size, StringCls, NULL); 
if (result == NULL) return NULL; 
... 
} 

Pero aquí, no sé el parámetro int size: No sé el número de cuerdas que voy a utilizar para rellenar mi matriz. Entonces, ¿hay alguna manera de crear un objeto de trabajo sin saber de antemano el tamaño de la matriz?

¿Algo así como crear una matriz vacía y luego agregar jobject uno por uno a esa matriz?


EDITAR: solución utilizando un ArrayList como Edwin sugirió

jclass arrayClass = (*jenv)->FindClass(jenv, "java/util/ArrayList"); 
    if (arrayClass == NULL) return NULL; 

jmethodID mid_init = (*jenv)->GetMethodID(jenv, arrayClass, "<init>", "()V"); 
    if (mid_init == NULL) return NULL; 

jobject objArr = (*jenv)->NewObject(jenv, arrayClass, mid_init)); 
    if (objArr == NULL) return NULL; 

mid_add = (*jenv)->GetMethodID(jenv, arrayClass, "add", "(Ljava/lang/Object;)Z"); 
    if (mid_add == NULL) return NULL; 

Luego, en un bucle que crea una jobject obj para cada nuevo objeto que necesito para añadir a la arrayList:

jboolean jbool = (*jenv)->CallBooleanMethod(jenv, objArr, mid_add, obj); 
    if (jbool == NULL) return NULL; 

Respuesta

10

Si desea que la tienda de respaldo (la matriz) crezca a medida que la agrega, use un java.util.ArrayList. Puede significar algunas llamadas JNI más (para configurar el objeto), pero en su caso parece que vale la pena el esfuerzo.

+0

Derecha. Lo echaré un vistazo el lunes. – leochab

Cuestiones relacionadas