incStrong() 和 decStrong()

news/2024/12/5 6:16:58/

在 Android JNI 层代码中,incStrong()decStrong() 是在使用跨越 JNI 边界的对象时常见的方法。它们用于在本地代码中增加和减少对象的引用计数。这些方法通常用于管理对象的生命周期,以确保在不再需要对象时能够正确释放资源。

在 Android 中,引用计数是通过 sp<>强引用计数)和 wp<>弱引用计数)智能指针类来管理的。这些智能指针类提供了对对象生命周期的自动管理。

  • incStrong(): 这个方法用于增加对象的引用计数。每次调用 incStrong(),对象的引用计数会增加。当某个对象的引用计数大于 0 时,它将保持在内存中。
  • decStrong(): 这个方法用于减少对象的引用计数。每次调用 decStrong(),对象的引用计数会减少。当某个对象的引用计数等于 0 时,它将被自动释放,并且相关的资源将被清理。

通常情况下,在 JNI 层代码中,当你通过 JNI 获取到一个 Java 对象的引用时,你需要使用 incStrong() 来增加引用计数,以确保对象在使用期间不会被提前释放。而在不再需要该对象时,你需要使用 decStrong() 来逐渐减少引用计数,最终释放对象。

这种引用计数管理方式是 Android 框架中常见的一种手段,它确保了跨越 JNI 边界的对象能够正确地管理其生命周期,避免内存泄漏和使用已释放对象的问题。

请注意,这些方法是在 C/C++ 代码中使用的,而不是在 Java 代码中。在 Java 层代码中,你可以直接使用普通的 Java 引用,而不需要手动管理引用计数。

//  frameworks/base/core/jni/android_os_MessageQueue.cpp
static jlong android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) {NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();if (!nativeMessageQueue) {jniThrowRuntimeException(env, "Unable to allocate native queue");return 0;}nativeMessageQueue->incStrong(env); // 增加应用计数return reinterpret_cast<jlong>(nativeMessageQueue);
}

这段代码中的 nativeMessageQueue->incStrong(env) 调用会增加 nativeMessageQueue 对象的引用计数。

在这段代码中,首先通过 new 操作符创建了一个 NativeMessageQueue 对象,并将其分配给 nativeMessageQueue 指针。

接下来,通过调用 nativeMessageQueue->incStrong(env),将增加 nativeMessageQueue 对象的引用计数。这是为了确保在 JNI 层代码中持有该对象的有效引用,并防止在使用期间对象被意外释放。

incStrong(env) 方法中,实际上会增加该对象的引用计数,这样对象就可以继续存在,以确保在使用期间对象保持有效。直到相应的 decStrong() 方法调用减少引用计数并最终释放对象。

请注意,这段代码中的 incStrong(env) 方法可能是 NativeMessageQueue 类的自定义方法,它可能使用了 Android 引用计数模型的具体实现。


http://www.ppmy.cn/news/1157386.html

相关文章

图像边缘检测--(Sobel、Laplacian、Canny)

1、图像中各种形状的检测时计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面将介绍如何快速检测图像边缘。 2、边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不是绝对的定义,…

IDEA的使用(四)创建不同类型的工程(IntelliJ IDEA 2022.1.3版本)

1. 创建Java工程 创建之后&#xff0c;src下是空的。可以在src下创建软件包Package&#xff0c;命名采用域名倒序。在软件包下再创建Java类。Java类运行后出现中文乱码&#xff0c;就到控制台和文件编码这两个地方设置编码。 2. 创建JavaWeb工程 2.1 在win11和IDEA中配置Tomca…

C# RestoreFormer 图像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

LeetCode【46】全排列

题目&#xff1a; 代码&#xff1a; 在这里插入代码片

Unity中Shader的深度写入ZWrite

文章目录 前言一、更新深度缓冲区中值二、深度值的写入操作只有两个选择 开启 和 关闭ZWrite OnZWrite Off 三、深度写入在半透明物体物体中开启的情况1、特效一般都需要关闭深度写入2、如果在人物模型上使用 特效半透明 的 Shader&#xff0c;为了不出现模型自身穿透问题&…

Python 读取.tsv文件

TSV&#xff08;Tab Separated Values&#xff09;和CSV&#xff08;Comma Separated Values&#xff09;都是常见的文本文件格式&#xff0c;用于存储表格数据。它们之间的主要区别在于字段之间的分隔符。 CSV&#xff08;逗号分隔值&#xff09;: 使用逗号作为字段之间的分隔…

xml的语法

<!-- 1、每一个xml,有且只有一个根标签&#xff0c;所有xml标签必须写在根标签中 2、标签必须要有合闭 3、xml格式是否正确&#xff0c;可以通过浏览器打开xml。来校验xml格式是否正确 4、xml是区别大小写的 5、xml书写标签名时&#xff0c;不要出现空格等特…

C/C++陷阱——临时变量的产生和特性

C/C陷阱——临时变量的产生和特性 在学习C常引用时&#xff0c;有这样一段代码引起了我的注意&#xff1a; int a 1; double& b a;当我编译这段代码时&#xff0c;竟然报错了&#xff1a; 按理来说&#xff0c;初始化引用时不能涉及权限的放大&#xff08;如用const in…