You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JNI中释放C++类实例?现有方法报错求助

错误原因及正确释放C++类实例的方法

错误根源

你用env->DeleteLocalRef(reinterpret_cast<jobject>(pLive))完全找错了方向:

  • DeleteLocalRef是JNI专属API,仅用于释放Java虚拟机创建的本地引用(比如jobject、jclass这类JNI类型对象)。
  • pLive是C++类Live的原生实例指针,和JNI对象属于完全不同的内存管理体系,强行转换类型调用JNI方法必然触发错误。

正确释放方式

1. 明确Live的实例创建逻辑

你的代码用了Live::getInstance(),这是典型的单例模式实现。单例的实例由类内部静态管理,不能直接用delete销毁,必须由类提供专门的销毁接口。

2. 给Live类添加销毁方法

修改Live类的实现,增加静态销毁函数:

class Live {
private:
    static Live* instance;
    // 私有构造,禁止外部创建实例
    Live() {}
    // 私有析构,禁止外部直接delete
    ~Live() {
        // 在这里释放类内部资源:比如动态分配的内存、持有的JNI引用等
    }
public:
    static Live* getInstance() {
        if (!instance) {
            instance = new Live();
        }
        return instance;
    }

    // 专门的销毁方法
    static void destroyInstance() {
        if (instance) {
            delete instance;
            instance = nullptr; // 重置指针,避免野指针
        }
    }
};

// 类外部初始化静态成员
Live* Live::instance = nullptr;

3. 正确调用销毁逻辑

使用时替换错误的DeleteLocalRef调用:

Live *pLive = Live::getInstance();
// do something with pLive
Live::destroyInstance(); // 调用类提供的销毁方法

特殊情况:如果Live持有JNI对象

如果Live内部保存了jobject或其他JNI引用,需要在析构函数中先释放这些JNI引用,再销毁C++实例:

~Live() {
    if (m_jni_obj) { // m_jni_obj是类内部持有的jobject
        env->DeleteLocalRef(m_jni_obj);
        m_jni_obj = nullptr;
    }
    // 其他资源释放
}

内容的提问来源于stack exchange,提问作者fresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:23:23