Failed adding to JNI pinned array ref table (1024 entries)
在jni中频繁调用java的接口出现以上错误
出现情况:
之前正常调用的时候并未出现,后面增加了调用频率,当程序运行到一段时间,出现以上错误
分析:
低频率的通过JNI机制进行了java和C相互调用并未导致内存的溢出,也有可能是运行的时间还不够,当增加调用频率就很明显的出现了此问题,。查看c代码,发现是传入的int型数组转换时分配了空间,结束时没有释放空间,所以就crach了。
解决办法:
在c文件中,每次return返回数据前释放资源:
void status_callBack(unsigned int* obstacle, part_status_t* foot, part_status_t* hand_left, part_status_t* hand_right, part_status_t* head_horizontal, part_status_t* head_vertical){ JNIEnv *env = 0; if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK) { LOGI("%s: AttachCurrentThread() failed", __FUNCTION__); return; } jmethodID java_status_callback=(*env)->GetMethodID(env,native_proxy_cls,"getSunboStatus","()[I"); jobject object = (*env)->CallObjectMethod(env, g_obj, java_status_callback); jintArray array =(jintArray)object; jint len = (*env)->GetArrayLength(env,array); jint* status_array = (*env)->GetIntArrayElements(env,array,NULL); if(status_array[0]==1){ *obstacle = status_array[13]; foot->status = status_array[1]; foot->speed = status_array[8]; hand_left->status = status_array[2]; hand_left->speed = status_array[9]; hand_right->status =status_array[3]; hand_right->speed = status_array[10]; head_horizontal->status = status_array[5]; head_horizontal->speed = status_array[12]; head_horizontal->pos =status_array[6]; head_vertical->status =status_array[4]; head_vertical->speed = status_array[11]; head_vertical->pos = status_array[7]; } (*env)->ReleaseIntArrayElements(env,array,status_array,0); if ((*g_jvm)->DetachCurrentThread(g_jvm)!=JNI_OK) { LOGI("%s: DetachCurrentThread() failed", __FUNCTION__); } }
增加资源回收问题就解决了
同理一些String、byte数组等等数据类型的使用完后一定要记得回收