jni 错误

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数组等等数据类型的使用完后一定要记得回收


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值