最近在跟一个Android崩溃问题,现象是在某些手机上app会崩溃,有些不会。仔细跟踪了代码发现,在JNI中,转换某数据过程中,会崩溃到以下地方:
NewObject失败;
NewStringUTF 失败;
FindClass 失败;
等等。
查看logcat,果然有local reference table overflow问题:
JNI ERROR (app bug): local reference table overflow (max=512) local reference table dump
在JNI中,new的局部引用需要释放掉,必须DeleteLocalRef,否则会报local reference table溢出问题。
解决方法如下:
在使用过FindClass/NewString/ NewStringUTF/NewObject/ GetObjectField 这些都应该加上DeleteLocalRef.
例如:
jstring tempString = env->NewStringUTF(str.c_str());
env->SetObjectField(jobjectNodeInfo, jfieldIDNodeName, tempString);
// 下面这句一定要加,否则局部引用表会溢出。
env->DeleteLocalRef(tempString);
即可。
网友评论