JNI練習-記憶體溢位

weixin_34337265發表於2015-05-18

這部分內容主要是參考Android NDK開發(六)——使用開源LAME轉碼mp3.
我們參照原文,可以很方便的實現功能,但在測試的時候,發現在轉碼大檔案時,程式跑一段時間就會報錯: local reference table overflow (max=512)。這就引出了我們在JNI開發中會遇到的一個很常見的問題:記憶體洩漏。
具體說明就是在下面的方法呼叫過程中,沒有新增註釋掉的清理本地引用的程式碼。
關於JNI記憶體洩漏,可以參考這篇文章:jni 記憶體洩漏

/**
 * 呼叫java程式碼 更新程式的進度條
 */
void publishJavaProgress(JNIEnv * env, jobject obj, jint progress) {
    // 1.找到java的MainActivity的class
    jclass clazz = (*env)->FindClass(env, "com/example/testndk/MainActivity");
    if (clazz == 0) {
        LOGI("can't find clazz");
    }
    LOGI(" find clazz");

    //2 找到class 裡面的方法定義
    jmethodID methodid = (*env)->GetMethodID(env, clazz, "setConvertProgress","(I)V");
    if (methodid == 0) {
        LOGI("can't find methodid");
    }
    LOGI(" find methodid");

    //3 .呼叫方法
    (*env)->CallVoidMethod(env, obj, methodid, progress);

    /*
    //去掉本地引用
    if(methodid){
        (*env)->DeleteLocalRef(env,methodid);
    }
    if(clazz){
        (*env)->DeleteLocalRef(env,clazz);
    }
    */
}

相關文章