2010-11-21 4 views
0

J'ai trouvé un comportement étrange concernant les tableaux multidimensionnels dans JNI et après des heures de recherche, je n'ai toujours aucune idée de comment résoudre mon problème. J'ai le code JNI suivant:Comportement de mémoire étrange dans JNI

JNIEXPORT jobject JNICALL Java_leaktest_NativeClass_nativeCalculation 
    (JNIEnv *env, jobject thiz, jobjectArray arr) { 

    double** multidimArray = new double*[512]; 

    for (int i = 0;i < 512;i++) { 
     multidimArray[i] = new double[512]; 

     for (int j = 0;j < 512;j++) { 
      multidimArray[i][j] = i * j; 
     } 
    } 

    jobjectArray jMultidimArray = env->NewObjectArray(512, env->FindClass("[D"), 0); 

    for (int i = 0;i < 512;i++) { 
     jdoubleArray row = env->NewDoubleArray(512); 

     jdouble* elems = (jdouble*)multidimArray[i]; 

     env->SetDoubleArrayRegion(row, 0, 512, elems); 
     env->SetObjectArrayElement(jMultidimArray, i, row); 

     env->DeleteLocalRef(row); 
    } 

    jclass arrayClass = env->FindClass("leaktest/ArrayClass"); 

    jobject arrObj = env->NewObject(arrayClass, env->GetMethodID(arrayClass, "<init>", "(II[[D)V"), 512, 512, jMultidimArray); 

    for (int i = 0;i < 512;i++) { 
     delete multidimArray[i]; 
    } 

    delete multidimArray; 

    return arrObj; 
} 

En Java, j'appelle simplement cette méthode native à plusieurs reprises. Avec chaque appel, la quantité de RAM affichée par la JVM augmente d'environ 1 à 2 Mo. Il me semble que je suis quelque part en train d'allouer de la mémoire dans la partie C++ et de ne jamais la relâcher, mais je n'ai aucune idée de l'endroit où cela devrait se produire.

Michael

Répondre

0

Je pense que ce serait ici

jclass arrayClass = env->FindClass("leaktest/ArrayClass");

jobject arrObj = env->NewObject(arrayClass, env->GetMethodID(arrayClass, "<init>", "(II[[D)V"), 512, 512, jMultidimArray);