標籤:sel har table new splay fopen sizeof ref odi
原因是沒即時釋放對象,原本的代碼是這樣
static jobject getMaps(JNIEnv *env,jclass obj){jclass stringbuilder_class = (*env)->FindClass(env,"java/lang/StringBuilder");jmethodID init_stringbuilder_Method = (*env)->GetMethodID(env,stringbuilder_class,"<init>","()V");jobject stringbuilder_obj=(*env)->NewObject(env,stringbuilder_class,init_stringbuilder_Method);jmethodID append_Method = (*env)->GetMethodID(env,stringbuilder_class,"append","(Ljava/lang/Object;)Ljava/lang/StringBuilder;");FILE * fileP;char item[200]="ii";fileP = fopen( "/proc/self/maps","r");if(!fileP)return stringbuilder_obj;while(fgets(item,sizeof(item),fileP)!=NULL){jstring str = (*env)->NewStringUTF(env,item);(*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str);(*env)->ReleaseStringUTFChars(env,str,item);(*env)->DeleteLocalRef(env,str);}return stringbuilder_obj;}
直接看去好像沒什麼問題,但是每調用一次 (*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str)
;都會產生個對象,我一開始以為這樣沒事,改成這樣程式就不崩了
static jobject getMaps(JNIEnv *env,jclass obj){jclass stringbuilder_class = (*env)->FindClass(env,"java/lang/StringBuilder");jmethodID init_stringbuilder_Method = (*env)->GetMethodID(env,stringbuilder_class,"<init>","()V");jobject stringbuilder_obj=(*env)->NewObject(env,stringbuilder_class,init_stringbuilder_Method);jmethodID append_Method = (*env)->GetMethodID(env,stringbuilder_class,"append","(Ljava/lang/Object;)Ljava/lang/StringBuilder;");FILE * fileP;char item[200]="ii";fileP = fopen( "/proc/self/maps","r");if(!fileP)return stringbuilder_obj;while(fgets(item,sizeof(item),fileP)!=NULL){jstring str = (*env)->NewStringUTF(env,item);//加個temp用來釋放jobject temp=(*env)->CallObjectMethod(env,stringbuilder_obj,append_Method,str);(*env)->ReleaseStringUTFChars(env,str,item);(*env)->DeleteLocalRef(env,str);(*env)->DeleteLocalRef(env,temp);}return stringbuilder_obj;}
JNI記憶體泄露JNI ERROR (app bug): local reference table overflow (max=512)