incStrong() 和 decStrong()

本文详细解释了AndroidJNI层中incStrong和decStrong函数的作用,它们用于管理对象的生命周期,确保跨JNI边界时资源的正确释放,防止内存泄漏。通过实例代码展示了如何在JNI层增加和减少引用计数以维护对象的生存期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 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 引用计数模型的具体实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值