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; } }
分类:
android提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2014-12-09 Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
2014-12-09 Android 菜单(OptionMenu)大全 建立你自己的菜单
2013-12-09 JAVA线程池例子
2013-12-09 JAVA对ArrayList排序
2013-12-09 Java安全停止线程方法