2012-10-02 26 views
5

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

Respuesta

5

Descubrí lo que estaba haciendo mal, mejor, lo que olvidé hacer. Tengo otro punto de retorno en el código, pero olvidé liberar las matrices antes de volver en ese caso, solo lo estaba liberando al final de la función.

1

Parece que un error en la implementación de JNI para mí. Una solución obvia es utilizar una matriz unidimensional en su lugar. Al parecer, la matriz no está mellada en el lado de Java, por lo que sería bastante sencillo realizar la conversión de un lado a otro. El índice del elemento (i,j) en la matriz 1D sería i*xdim + j.

+0

Gracias por su respuesta, pero descubrí que el problema no estaba en la parte que publiqué anteriormente. – Deadlock

Cuestiones relacionadas