這部分內(nèi)容主要是參考Android NDK開發(fā)(六)——使用開源LAME轉碼mp3.
我們參照原文惫搏,可以很方便的實現(xiàn)功能骗露,但在測試的時候师枣,發(fā)現(xiàn)在轉碼大文件時互拾,程序跑一段時間就會報錯: local reference table overflow (max=512)歪今。這就引出了我們在JNI開發(fā)中會遇到的一個很常見的問題:內(nèi)存泄漏。
具體說明就是在下面的方法調(diào)用過程中颜矿,沒有添加注釋掉的清理本地引用的代碼彤委。
關于JNI內(nèi)存泄漏,可以參考這篇文章:jni 內(nèi)存泄漏
/**
* 調(diào)用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 .調(diào)用方法
(*env)->CallVoidMethod(env, obj, methodid, progress);
/*
//去掉本地引用
if(methodid){
(*env)->DeleteLocalRef(env,methodid);
}
if(clazz){
(*env)->DeleteLocalRef(env,clazz);
}
*/
}