美文网首页Android NDK学习
Android JNI开发--资源释放问题

Android JNI开发--资源释放问题

作者: MzDavid | 来源:发表于2019-08-14 10:36 被阅读0次

最近又在开发JNI相关的项目了。本来一切正常,坐等测试完毕发布版本,然而理想是美好的,现实是骨感的。测试跑过来跟我说在测异常流程(开发人员听到估计就头疼)的时候发生了闪退问题。我赶紧拿过来自己测,果然复现了,日志中显示local reference table overflow (max=512) 。嗯?JNI中出现了内存泄漏?可是我已经按照网上的例子把所有该释放的对象都释放了啊,怎么回事啊?

先来看下有哪些要释放的:

  1. FindClass

    jclass ref= (env)->FindClass("java/lang/String");
    env->DeleteLocalRef(ref);   
    
  2. NewString/ NewStringUTF/NewObject/NewByteArray

    // 创建 jstring 和 char*
    jstring jstr = (*jniEnv)->CallObjectMethod(jniEnv, test1, test2);
    char* cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0);
    
    // 释放
    (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);
    (*jniEnv)->DeleteLocalRef(jniEnv, jstr);
    
  3. GetObjectField/GetObjectClass/GetObjectArrayElement

    jclass ref = env->GetObjectClass(robj);
    env->DeleteLocalRef(ref);   
    
  4. GetByteArrayElements

    jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);
    (*env)->ReleaseByteArrayElements(env,jarray,array,0);  
    
  5. NewGlobalRef/DeleteGlobalRef

    jobject ref= env->NewGlobalRef(customObj);
    env->DeleteGlobalRef(customObj);  
    

开始了苦逼的代码检查之路,找了许久,考虑各种可能的原因,然后各种测试,还是会在异常流程中出现闪退,令人绝望。

最后,忽然看到了这个:

jbyteArray arr = (jbyteArray) (*env)->CallObjectMethod(env, local_object, methodID, java_slot,jbyteArray1);

从JNI中反射调用Java层方法,返回了一个字节数组,我去。。。,没有删除这个对象,这个数组在异常流程中被不断创建,并且没有得到回收,所以很快就出现了local reference table overflow (max=512)错误。找到问题根源了,赶紧检查代码,所有类似的接口全部进行修改。

(*env)->DeleteLocalRef(env, arr);

然后再次送测,终于没有问题了。

因为这个,要解决只要一行代码的问题,花费了我大半个下午时间,所以在这里记录一下,提醒自己,以后记得释放所有在Native层中创建的本地对象!

相关文章

  • Android JNI开发--资源释放问题

    最近又在开发JNI相关的项目了。本来一切正常,坐等测试完毕发布版本,然而理想是美好的,现实是骨感的。测试跑过来跟我...

  • android-如何在jni中C/C++层打印log到logca

    最近在做android jni的开发,需要输出一些log方便调试分析问题,但是jni层里不能像纯android开发...

  • JNI资源释放

    因为Native层资源是不被GC回收的,我们要手动释放。 有哪些资源需要释放呢? 释放之后怎么确认释放了呢? 引用...

  • JNI Crash:异常定位与捕获处理

    关键词:JNI Crash,异常检测,信号量捕获 在Android JNI开发中,经常会遇到JNI崩溃的问题,尤其...

  • JNI 入门

    ref: Android Studio开发JNI示例Android NDK 开发(二)JNI 传递参数和返回值An...

  • 春招笔记(十四)

    1.是否熟悉Android jni开发,jni如何调用java层代码 在Android开发中,使用NDK开发的需求...

  • Android JNI NDK 开发

    Android 开发过程中必然会涉及 JNI 与 NDK 开发,简单梳理下 JNI 流程 开发环境:Android...

  • Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...

  • JNI与底层调用1

    JNI开发系列阅读 JNI与底层调用1 JNI与底层调用2 C/C++在Android开发中的应用 1. JNI ...

  • WebRTC PeerConnection 资源释放

    关闭PeerConnection需要释放资源 开发WebRTC应用时遇到这样一个问题iOS和Android端第二次...

网友评论

    本文标题:Android JNI开发--资源释放问题

    本文链接:https://www.haomeiwen.com/subject/mznwjctx.html