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