android - 编写强引用java对象

Android-强引用、软引用、弱引用、虚引用的区别与应用 1、强引用(StrongReference) 强引用就是平时最常用的定义变量的方式,即: //这都是我们最常定义变量的方式 val strongReference="强引用" val strongReferenceList= mutableListOf<String>("强","引","用") 强引用可以直接访问目标对象。 强引用所指向的对象在任何时候都不会被系统回收。当内存空间不足时,Java虚拟机宁可抛出OutOfMemoryError异常,也不会通过去回收强引用 阅读详情

JAVA有个垃圾回收机制,没有引用的对象会被虚拟机在整理内存时进行回收,所以使用弱引用java对象时,而实际调用为持久对象时将会出现问题。并且这个问题有时会随机出现,这个会内存整理回收时机有关。

下面,说下对于在JNI中使用JAVA中对象代码编写方法:


JAVA类方法编写:

public class TestModule{
	static native boolean native_init(WeakReference<TestModule> wo);
	
	/* 构造函数中传递JAVA弱应用对象给JNI层 */
	public TestModule() {
		native_init(new WeakReference<TestModule>(this));
	}

	...
	
	/* 提供给JNI调用的JAVA方法 */
	static String native_callback(Object wo, int i, String json) {
		try {
			WeakReference<CDCAModule> r = (WeakReference<TestModule>) wo;
			CDCAModule m = r.get();
			if (m != null)
				return m.callback.callback(i, json);
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return null;
	}
}


JNI 编写方法:

static jobject   g_java_peer = NULL;
static jmethodID g_callback = NULL;

/* 对应JAVA层native_init函数 */
JNIEXPORT jboolean JNICALL Java_com_test_TestModule_native_init(JNIEnv *e,
		jclass clazz, jobject wo) {
	if (wo == NULL)
		throw_runtime_exception(e, "");
		
	/**
	 * 如果这个JAVA对象,垃圾回收时不予释放掉,使用弱引用转换成强引用对象,如此
	 *  则仅用户进行主动释放时此对象才无效
	 */
	if (g_java_peer == NULL)
		g_java_peer = e->NewGlobalRef(wo);

	/* 获取得到JAVA中定义的方法 */
	if ((g_callback = e->GetStaticMethodID(clazz, "native_callback",
			"Ljava/lang/Object;ILjava/lang/String")) == NULL)
		return JNI_FALSE;
	return JNI_TRUE;
}

char*jniCallJavaTestModuleMethod(int id, const char*json, char*buf, int len) {
	JNIEnv*e = NULL;
	jstring ret = NULL;
	char *p = NULL;
	int rlen;

	if (id < 0 || buf == NULL || len <= 0)
		return NULL;
	/* 这里注意,JNIEnv是一个线程相关的变量,所以使用javaAttachThread保证取得当前线程的Jni环境变量*/
	if ((e = javaAttachThread("test-thread")) == NULL)
		return NULL;
		
	/* 调用JAVA方法 */
	if ((ret = (jstring) e->CallStaticObjectMethod((jclass)g_java_peer, g_callback,
			json ? e->NewStringUTF(json) : NULL)) == NULL)
		return NULL;
	p = buf;
	if ((rlen = e->GetStringLength(ret)) > len) {
		char*p = (char*)calloc(1,rlen);
		if (p == NULL)
			return NULL;
	}
	e->GetStringUTFRegion(ret, 0, rlen, p);
	return p;
}


在JNI中提供三种类型的引用:

1、Local Reference 本地引用,函数调用时传入jobject或者jni函数创建的jobejct,其特点就是一旦JNI层函数返回,jobject就被垃圾回收掉,所以需要注意其生命周期。可以强制调用DeleteLocalRef进行立即回收。

       jstring pathStr = env->NewStringUTF(path)

       ....

env->DeleteLocalRef(pathStr);


2、Global Reference 全局引用 ,这种对象如不主动释放,它永远都不会被垃圾回收

      创建: env->NewGlobalRef(obj);

      释放: env->DeleteGlobalRef(obj)


3、Weak Global Reference 弱全局引用,一种特殊的 Global Reference ,在运行过程中可能被垃圾回收掉,所以使用时请务必注意其生命周期及随时可能被垃圾回收掉,比如内存不足时。

使用前可以利用JNIEnv的 IsSameObject 进行判定它是否被回收

env->IsSameObject(obj1,obj2);


Java引用类型深度解析:从强引用到虚引用的完整指南 Java的引用类型是内存管理的核心机制,直接影响对象的生命周期和垃圾回收(GC)行为。合理使用不同引用类型可以实现和等高级功能。 阅读详情

相关推荐

Android编写保持Java对象的强引用

强引用是最常用的引用类型,但在某些情况下,我们可能需要使用其他类型的引用,如软引用(Soft Reference)、弱引用(Weak Reference)或虚引用(Phantom Reference)。强引用是最常见的引用类型,当一个对象被一个强引用引用时,它将一直存在,直到该引用被显式地释放。强引用是最常见的引用类型,当一个对象被一个强引用引用时,它将一直存在,直到该引用被显式地释放。需要注意的是,由于强引用会一直持有对象,如果我们不再需要该对象,应该及时将强引用置为。在上面的示例中,我们在。

2301_79331387的博客 125

Android的四种引用(强引用、弱引用、软引用、虚引用)

前言:满纸荒唐言,一把辛酸泪;都云作者痴,谁解其中味。 一、概述 早在JDK1.2就把对象引用分为四种级别,从而使程序能更灵活控制它的生命周期,级别由高到底依次为:强 >软 > 弱 > 虚引用。而GC垃圾回收器(Garbage Collection)对不同的类型有着不同的处理方法,了解这些处理方式有助于我们写出更高质量的代码。 在Java中,一切被视为对象,引用则是用...

https://juejin.cn/user/1654096907477549/posts 8522

MCP详解:手把手教你理解和如何使用各种开源MCP服务

MCP 作为一种开放协议,为 AI 模型与外部世界的连接提供了标准化的解决方案。它不仅降低了开发门槛,还极大地扩展了 AI 应用的边界。无论是开发者还是普通用户,都可以通过 MCP 更高效地利用 AI 技术,实现更多智能化的功能。

王哥儿聊AI的博客 6056

android软引用如何使用方法,Android的四种引用(强引用、弱引用、软引用、虚引用)...

前言:满纸荒唐言,一把辛酸泪;都云作者痴,谁解其中味。一、概述早在JDK1.2就把对象引用分为四种级别,从而使程序能更灵活控制它的生命周期,级别由高到底依次为:强 >软 > 弱 > 虚引用。而GC垃圾回收器(Garbage Collection)对不同的类型有着不同的处理方法,了解这些处理方式有助于我们写出更高质量的代码。在Java中,一切被视为对象,引用则是用来操纵对象的。对...

weixin_29560137的博客 1586

DTW Barycenter Averaging(DBA)——平均序列求法

DBA该算法是用来求序列数据集SS的一致序列(平均序列)。由Franc-ois Petitjean提出的。目前,该方法求得的平均序列是最准确的。 假设一元组为S={s1,s2,⋯,sn}S={s1,s2,\cdots,sn},当SS中的元素为实数时,很容易求的SS的平均值: avg=s1+s2+⋯+snn(1) avg = \dfrac{s1 +s2+\cdots+sn}{n} \qquad\q

光怪陆离 1万+

基于Java+Maven+Testng+RestAssured+Allure+Jenkins搭建一个接口自动化框架

2、有一个提取表达式列,通过编写每个接口的JSON提取表达式,后边在解析Excel时,对接口执行后的响应数据用该表达式提取出来,保存到环境变量,如果某些接口需要前置接口的响应数据,我们就可以从环境变量中获取该数据出来,从而解决了接口关联的问题。1、在之前介绍过全局配置类Contants中添加一个控制台日志开关控制权限,如果选择为false,则控制台不输出日志,将日志输出到allure报表,选择为true,则在控制台输出日志,不输出到allure报表。

专注于技术分享的博主 1183

android 对象和引用,Android - 编写强引用Java对象

Java有个垃圾回收机制,没有引用的对象会被虚拟机在整理内存时进行回收,所以使用弱引用java对象时,而实际调用为持久对象时将会出现问题。并且这个问题有时会随机出现,这个会内存整理回收时机有关。下面,说下对于在JNI中使用JAVA中对象代码编写方法:JAVA类方法编写:publicclassTestModule{staticnativebooleannative_init(WeakReferenc...

weixin_42537142的博客 107

【Telephony】APN配置及加载流程&项目实践(AOSP)

学习APN关键是学会明白apns-conf.xml文件各个参数的意思,然后熟悉TelephonyProvider是如何读取文件创建数据库的,譬如数据库表的约束、文件的读写顺序等,还有读取后的ApnSetting的二次定制以及显示(例如屏蔽xcap等)。虽然一般在项目中APN的需求很简单,就是按照客户提供的APN参数添加上配置,或者在显示屏蔽一些参数,但是项目维护的过程中APN的问题也是比较多的。

weixin_44513784的博客 5509

java对象的强引用,软引用,弱引用和虚引用

<br />     众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。<br /> <br />     在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走。一般说来,如果物

lengyuhong的专栏 4万+

基于DynamicHead的YOLOv8四头版本改进:面向复杂场景的多目标检测优化【YOLOv8】

YOLOv8的检测头是通过不同尺度的特征层输出检测结果。这些检测头通常包括三个:用于大物体、中等物体和小物体的检测。然而,这种单一结构可能会在复杂场景下失去针对性和灵活性,特别是当多个目标之间差异较大时。为了进一步提升模型在特定目标上的检测性能,DynamicHead的引入为我们提供了一个多检测头的优化方案。本文提出了一种基于DynamicHead的四头版本YOLOv8改进方案,以解决复杂场景下多目标检测的挑战。通过引入四个独立检测头,分别针对不同目标特征进行优化,实现了更灵活的检测结构。

博客 1718

【WRF-Urban】使用 LCZ 替换 WRF 运行中的 LUCC 数据

使用 LCZ 替换 WRF 运行中的 LUCC 数据

WW、forever的博客 988

Android 强引用、软引用、弱引用、虚引用

1、强引用(StrongReference)           强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: ? 1 Object o=new Object();   //  强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程

lebron_wei的专栏 1824

总结目前开源的视频生成/视频编辑大模型

随着Sora的爆火,视频生成和视频编辑受到了越来越多的关注。这篇博客总结一下目前开源的视频生成和视频编辑的大模型,并分析他们各自的优缺点,以及在自己进行科研任务或者工作中应该如何选用对应的开源模型,希望能给从事这一领域研究和使用的小伙伴们帮助。

沉迷单车的追风少年 3544

android 软引用对象,Android四种引用:强引用、软引用、弱引用和虚引用

Reference子类都具有如下特点:1.Reference子类不能无参化直接创建,必须至少以强引用对象为构造参数,创建各自的子类对象;2.以强引用对象为构造参数创建对象,使得原本强引用所指向的堆内存中的对象将不再只与强引用本身直接关联,与Reference的子类对象的引用也有一定联系。且此种联系将可能影响到对象的垃圾回收。强引用 - Strong reference实际编码中最常见的一种引用类型...

weixin_33513842的博客 316

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android对象引用,android/java 对象和引用的分析

预先:对象和引用的关系Car myCar = new Car();myCar.run();myCar是引用,new Car()是对象Car myCar;myCar.run();//这里的myCar引用没有对象,就会报错NullPointException注意,当我们尝试在一个未指向任何对象的引用上去操作对象时,就会遇到经典的空指针异常(NullPointerException)。可以理解成我们手持...

weixin_33162074的博客 261

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java弱引用在安卓中有效吗_Java/Android中的强引用、软引用、弱引用、虚引用

引用分为四个,从高到低的级别以此为强引用-软引用-弱引用-虚引用.引用类型类别回收机制用途生存时间强引用从不回收对象状态JVM停止运行时软引用内存不足时进行回收缓存内存不足弱引用对象不被引用时回收缓存GC运行后虚引用对象被回收时管理控制精确内存稳定性unknown强引用Qiang qiang=new Qiang();Niu niu=new Niu(qiang)强引用例子,niu持有qiang的引用...

weixin_36365168的博客 106

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Intent传递对象,强引用、软引用、弱引用的使用

Serializable Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地.序列化的方法很简单,实现Serializable接口就可以了. public class MyObject implements Serializable{ private int id; public MyOb...

ZhangJiqun&191cm&85kg 701

Java/Android中的强引用、软引用、弱引用、虚引用

引用分为四个,从高到低的级别以此为强引用-软引用-弱引用-虚引用. 引用类型 类别 回收机制 用途 生存时间 强引用 从不回收 对象状态 JVM停止运行时 软引用 内存不足时进行回收 缓存 内存不足 弱引用 对象不被引用时回收 缓存 GC运行后 虚引用 对象被回收时 管理控制精确内存稳定性 unknown强引用Qiang

asddavid的专栏 590

[Android]【安卓】【Java】强引用、软引用、弱引用和虚引用

[Android]【安卓】【Java】强引用、软引用、弱引用和虚引用 本篇博客已收录到我的安卓开发小结中——点击【安卓开发小结】 参考文章:Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用 Java中负责内存回收的是JVM。通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题。为了解决内存操作不灵...

Hy的博客 459

205.弱引用与强引用

──────────────────────────── 3. 弱引用(Weak Reference) ────────────────────────────。──────────────────────────── 5. 在 Android 开发中的实践 ────────────────────────────。──────────────────────────── 4. 强引用和弱引用的应用对比 ────────────────────────────。在代码中,默认赋值给变量的引用都是强引用。

2303_79132118的博客 812

【Android】了解强引用、软引用、弱引用、虚引用

【Android】了解强引用、软引用、弱引用、虚引用

微信公众号: 后端码匠 735

Android ---【内存优化】强引用、软引用、弱引用和虚引用

Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型分别有什么作用,又有什么区别呢?强引用是我们最常用的一种引用类型。当我们使用new关键字去新建一个对象的时候,创建的就是强引用。比如: 强引用有如下特点:强引用与Android开发中的OOM异常 OOM异常是Android开发过程中很常见的一种异常,下面来看一个例子: 简单的解释一下上面这段代码:MyAsyncTask会跟随Activity的onCreate去创建并开始执行一个长时间的耗时任务,并在耗时任务完成后去更新Mai

梁同学与Android 2251

Android中的强引用、软引用、弱引用和虚引用你真的都懂了嘛?

四大引用 Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型分别有什么作用,又有什么区别呢? 强引用(StrongReference) 强引用是我们最常用的一种引用类型。当我们使用new关键字去新建一个对象的时候,创建的就是强引用。比如: Obejct object = new Obejct(); 强引用有如下特点: 只要强引用存在,垃圾收集器永远不会回收掉被...

twistfatey的博客 673

Android中的引用类型(强引用,弱引用,软引用,虚引用)

如果对象A没有显式的把对象B的引用设为null的话,就只有当对象A被垃圾回收之后,对象B才不再有引用指向它,才可能获得被垃圾回收的机会。弱引用并不能阻止垃圾回收。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。Android中的对象有着4种引用类型,垃圾回收器对于不同的引用类型有着不同的处理方式,了解这些处理方式有助于我们避免写出会导致内存泄露的代码。需要注意的是,GC回收的是对象,在垃圾回收器运行的时候,如果对一个对象的所有引用。

2401_85239863的博客 382

java中对象的引用(强引用、软引用,android音乐播放器源码

以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以

m0_66264588的博客 102
上一篇: Android系统广电运营之我感
下一篇: Android ---- WebView与JavaScript交互调用(1)
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值