专栏首页android技术JNI--static静态修饰符和弱引用联合使用会出现的bug

JNI--static静态修饰符和弱引用联合使用会出现的bug

当static的修饰符出现是,表明该变量为静态变量,当我们为一个局部静态变量赋一个局部引用时(jstring,jclass,jint等),gc有可能会因为内存不够自动触发,回收局部引用,这时,局部静态变量就会出现野指针,如果不作异常处理则程序崩溃

//缓存策略和弱引用联合使用带来的问题
JNIEXPORT jstring JNICALL Java_JniMain_AcessCacheNewString
(JNIEnv * env, jobject jobj) {
    //定义一个静态的局部变量
    static jclass cls_string = NULL;
    if (cls_string == NULL)
    {
        printf("alvin in Java_JniMain_AcessCache_newString out: \n");
        //给局部静态变量赋一个局部引用
        cls_string = (*env)->FindClass(env, "com/dongnao/alvin/Refrence");
    }
    //使用这个静态局部变量 
    jmethodID jmid = (*env)->GetMethodID(env, cls_string, "getRef", "(I)I");
    jthrowable ex = (*env)->ExceptionOccurred(env);
    if (ex != NULL)
    {
        jclass newExc;
        // 让java 继续运行
        (*env)->ExceptionDescribe(env);//输出关于这个异常的描述
        (*env)->ExceptionClear(env);
        printf("C exceptions happend\n");
    }
    
    printf("alvin out Java_JniMain_AcessCache_newString\n");
    return NULL;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JNI--异常处理

    aruba
  • NDK--文件的拆分和合并

    aruba
  • JNI--动态注册

    静态注册: 每个class都需要使用javah生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运...

    aruba
  • Android Studio2.2下NDK开发初试

    forrestlin
  • NDK学习笔记(二)使用JNI同原生代码通信 原

    任何使用JNI的操作都需要两次或者三次函数调用,因此要实现大量的原生方法并让它们同Java类保持同步很容易编程一件非常艰辛的工作。

    LeoXu
  • laravel 学习之路 配置config

    laravel 的配置项是在根目录下的 /config 目录中,还有一个是根目录下的 .env文件

    风清醉
  • iOS 自动打包 - fastlane (二)

    .env 是非常简单的配置文件,简单到什么程度呢? 它只支持一维K/V格式的配置项,而且 key 和 value 都只能是字符串。

    大壮
  • JNI开发总结

    Android Ndk开发常用网站收集,真正的高手并不是掌握所有的API而是需要的时候可以快速的找到要使用的API。

    Anymarvel
  • Android App安全防范措施的小结

    关闭打印的日志,防止日志中的调试信息被看到。如果在网络框架中使用了日志,那就更加需要关闭了。

    fengzhizi715
  • jni小细节操作

    曾大稳

扫码关注云+社区

领取腾讯云代金券