如何在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
相关产品推荐
相关产品推荐

