Copié una matriz multidimensional de Java, pero estoy teniendo problemas para liberar la memoria después de usarla.Falló la adición a la tabla de referencia fija de JNI (1024 entradas)
lo que hice es:
jfieldID h_valID = (*env)->GetFieldID(env, h_cls, "val", "[[I");
jobjectArray h_val_obj = (*env)->GetObjectField(env, h, h_valID);
int h_val_local[xdim][ydim];
for(i=0; i<xdim; i++)
{
h_val_one_dim = (jintArray) (*env)->GetObjectArrayElement(env, h_val_obj, i);
h_val_elem = (*env)->GetIntArrayElements(env, h_val_one_dim, 0);
for(j=0; j<ydim; j++)
{
h_val_local[i][j] = h_val_elem[j];
}
(*env)->ReleaseIntArrayElements(env, h_val_one_dim, h_val_elem, 0);
(*env)->DeleteLocalRef(env, h_val_one_dim);
}
(*env)->DeleteLocalRef(env, h_val_obj);
tengo 4 matrices más en ese método, todos los parámetros, estoy recibiendo el puntero luego soltando después de usarlo.
int *x = (*env)->GetIntArrayElements(env,x_p,0);
int *y = (*env)->GetIntArrayElements(env,y_p,0);
int *v = (*env)->GetIntArrayElements(env,v_p,0);
int *w = (*env)->GetIntArrayElements(env,w_p,0);
...
(*env)->ReleaseIntArrayElements(env, x_p, x, 0);
(*env)->ReleaseIntArrayElements(env, y_p, y, 0);
(*env)->ReleaseIntArrayElements(env, v_p, v, 0);
(*env)->ReleaseIntArrayElements(env, w_p, w, 0);
Para archivos más grandes, estoy recibiendo desbordamiento en la tabla de referencia. ¿Qué me estoy olvidando de liberar o cómo puedo solucionar esto?
Log:
10-02 14: 18: 58.885: W/dalvikvm (23598): desbordamiento ReferenceTable (max = 1,024)
10-02 14: 18: 58.885: W/dalvikvm (23598): 10 entradas pasado en JNI tabla de referencia array clavado:
10-02 14: 18: 58.885: W/dalvikvm (23598): 1014: 0x46109fe8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1015: 0x4610a008 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1016: 0x46109fa8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598) : 1017: 0x46109fc8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1018: 0x46109fe8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1019: 0x4610a008 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1020: 0x46109fa8 cls = [ I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1021: 0x46109fc8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1022: 0x46109fe8 cls = [I (24 bytes)
10-02 14: 18: 58.885: W/dalvikvm (23598): 1023: 0x4610a008 cls = [I (24 bytes)
10-02 14 : 18: 58.885: W/dalvikvm (23598): resumen de tabla de referencia de matriz fija JNI (1024 entradas):
10-02 14: 18: 58.885: W/dalvikvm (23598): 1024 de [I 24B (4 único)
10-02 14: 18: 58.885: W/dalvikvm (23598): Memoria celebrada directamente por refs orugas es de 96 bytes
10-02 14:18:58.885: E/dalvikvm (23598): No se pudo añadir a la mesa de JNI gama ref clavado (1024 entradas)
THX
Gracias por su respuesta, pero descubrí que el problema no estaba en la parte que publiqué anteriormente. – Deadlock