Tengo el siguiente problema, desde C++ envío una gran cadena [] a java. enorme = como máximo 20 filas; que estoy haciendo lo siguienteAndroid NDK desborda dalvik JNI tabla de referencia local
jint jtype = 2;
jstring emptyString = env->NewStringUTF("");
jobjectArray data = (jobjectArray)env->NewObjectArray(7, env->FindClass("java/lang/String"), emptyString);
env->SetObjectArrayElement(data,0,env->NewStringUTF(item->get_id().c_str());
env->SetObjectArrayElement(data,1,env->NewStringUTF(item->get_number().c_str());
env->SetObjectArrayElement(data,2,env->NewStringUTF(item->get_fullname().c_str());
env->SetObjectArrayElement(data,3,env->NewStringUTF(item->get_mf().c_str());
env->SetObjectArrayElement(data,4,env->NewStringUTF(item->get_dob().c_str());
env->CallVoidMethod(dao, jsaveItem, data, jtype);
int i;
for (i = 0; i < 5; ++i) {
jstring string = (jstring) env->GetObjectArrayElement(data, i);
env->DeleteLocalRef(string);
}
env->DeleteLocalRef(emptyString);
env->DeleteLocalRef(data);
env->DeleteLocalRef(dao);
esto está sucediendo en un bucle por lo que estoy haciendo por todos los objetos que quiero guardar en la base de datos, así como se puede imaginar, happends un montón de veces.
Así Soy considerado de la máquina virtual y borrar los árbitros locales de cada cuerda creo, pero aún así me sale:
ReferenceTable overflow (max=512)
Last 10 entries in JNI local reference table:
502: 0x40552880 cls=Ljava/lang/String; (28 bytes)
503: 0x405528b8 cls=Ljava/lang/String; (28 bytes)
504: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
505: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
506: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
507: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
508: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
509: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
510: 0x4051f8d0 cls=Ljava/lang/Class; 'Lcom/project/storage/userdata/DataDao;' (212 bytes)
511: 0x4052eb38 cls=Lcom/project/storage/userdata/DataDao; (12 bytes)
JNI local reference table summary (512 entries):
58 of Ljava/lang/Class; 212B (1 unique)
1 of Ljava/lang/Class; 236B
25 of Ljava/lang/Class; 284B (1 unique)
1 of Ljava/lang/Class; 572B
392 of Ljava/lang/String; 28B (392 unique)
1 of Ljava/lang/String; 36B
1 of [Ljava/lang/String; 28B
2 of [Ljava/lang/String; 92B (2 unique)
31 of Lcom/project/storage/userdata/DataDao; 12B (1 unique)
Memory held directly by tracked refs is 12540 bytes
¿Alguna idea de por qué el desbordamiento está sucediendo? ¿Qué estoy haciendo mal?
Estoy bastante convencido de que debes llamar 'ReleaseStringUTFChars' para cada' NewStringUTF', independientemente de si haces 'DeleteLocalRef' después. –
¿Tiene sentido? dado que no estoy accediendo a jstring desde el vm pero enviando uno a él ... ¿Tendría que crear un puntero a la cadena y luego llamar usar ese puntero para hacer el releaseStringUtfChars ... – Tancho
Solo necesita llamar a 'ReleaseStringUTFChars() 'si previamente llamó' GetStringUTFChars() 'para crear una C-String a partir de una Java-String. Ese no es el caso aquí. –