JNI练习-内存溢出

这部分内容主要是参考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);
    }
    */
}

你可能感兴趣的:(JNI练习-内存溢出)