• Android NDK对象的引用-全局引用,局部引用,弱引用


    百度了一下,google了一下,关于NDK引用的介绍无10篇中就有9.9篇是相同的,对于这种问题,我只能呜呼哀哉了!!
    
     
    
    局部引用(函数内部对象类型变量):在C或C++中,局部变量表示只运行范围局限在该变量最近的 “{}”花括号里,常见的就是函数中的变量了,但局部引用和局部变量不同了,引用的主体是对象,指针,
    
    因此,设涉及到内存回收问题。同局部变量一样,局部对象在函数执行完成后会被立即销毁。
    
    (错误的用法1:将局部引用赋值给全局引用或弱引用)
    
     (错误的用法 : 引用被静态缓存,这种方法十分危险,容易导致程序蹦退,但不是不可以,只是引用的主题必须不是对象才行,比如jfieldID,jmethodID等)
    
    JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
      (JNIEnv * env, jobject thiz)
      {
        static jfieldID nameField = NULL;
        if(nameField==NULL)
        {
        nameField =  env->GetFieldID(clazz,"name","Ljava/lang/String;");
        }
        //do somthing
    }
    
     
    
    全局引用(函数外部对象类型变量):全局引用表示把局部引用通过某种方式复制给全局对象,并且该变量不会自动销毁,需要手动销毁
    
    jclass globalJclazz = NULL;
    JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
      (JNIEnv * env, jobject thiz)
    {
        if(globalJclazz==NULL)
        {
            __android_log_print(ANDROID_LOG_INFO,"REF","--1-->");
            globalJclazz = (jclass)(env->NewGlobalRef(env->GetObjectClass(thiz))); //转为全局引用
        }else{
            __android_log_print(ANDROID_LOG_INFO,"REF","--2-->");
            env->DeleteGlobalRef(globalJclazz);
            globalJclazz =NULL;
        }
    }
    
     
    
    弱引用:作用域同全局变量一样,但不能保证该引用一致从在,当内存不足时会自动销毁
    
    jclass weakclass = NULL;
    
    JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
      (JNIEnv * env, jobject thiz)
    {
        if(weakclass==NULL || (env->IsSameObject(weakclass,NULL))==JNI_TRUE)
        {
            jclass jclzz  = env->GetObjectClass(thiz);
            weakclass = (jclass)(env->NewWeakGlobalRef(jclzz));
        }else{
            env->DeleteWeakGlobalRef(weakclass);
            weakclass = NULL;
        }
    }
    
     
  • 相关阅读:
    goreplay~基本知识
    goreplay~http输出队列
    goreplay~拦截器设置
    goreplay~流量变速
    goreplay~http过滤参数
    goreplay~文件输出解析
    goreplay~http输出工作线程
    Antlr4 语法解析器(下)
    2021最新版Eclipse的下载和使用
    MySQL中drop、truncate和delete的区别
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6151223.html
Copyright © 2020-2023  润新知