2010-11-21 42 views
0

我在JNI中發現了一些關於多維數組的奇怪行爲,經過幾小時的研究,我仍然不知道如何解決我的問題。我有以下JNI代碼: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; 
} 

在Java中,我只是簡單地調用這個本地方法。每次調用時,JVM佔用的顯示內存量將增加大約1到2 MB。在我看來,我是在C++部分分配內存的地方,從不釋放它,但我不知道應該在哪裏發生。

邁克爾

回答

0

我的猜測是,這將是在這裏

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

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