Android开发中的JNI的内存管理

JNI中的对象

即便是写在C代码里面, 也可以在JNI中创建对象, 只是没有对对象操作的方法.
JNI中的对象默认最多创建16个, 如果使用EnsureLocalCapacity可以通过参数传递想创建对象的个数, 根据返回值确认是否可以创建.

JNI对象的销毁

默认最多16个对象, 所以如果超过16个, 就需要销毁, JNI提供了2种对象的销毁,
1. 局部对象, 定义在方法中的对象
2. 全局对象

需要销毁的对象

如果全局对象和局部对象可能超过16个就要及时销毁
全局对象比较多, 局部对象名额不足, 这个时候如果不用就需要及时销毁, 如果使用EnsureLocalCapacity扩充了能创建对象可创建的数量除外.

不需要销毁的对象

每次在函数返回后局部对象都会自动销毁, 可以不手动销毁
销毁局部对象: DeleteLocalRef
销毁全局对象: DeleteGlobalRef

销毁代码块创建的所有对象

通过PushLocalFrame方法开启代码块, 通过PopLocalFrame方法结束代码块, 这之间创建的对象都会被销毁. 除了PopLocalFrame的第二个参数的对象会在下一个代码块中重新创建并返回, 这个代码块中所有创建的对象都会被销毁
返回不被销毁的对象的用法

retStr = (*env)->PopLocalFrame(env, retStr);

该代码块所有对象都会被销毁的用法

(*env)->PopLocalFrame(env, NULL);

创建全局对象

很多时候全局对象是必须的, 可以在JNI的初始化方法JNI_OnLoad中就创建

dpClass = (*env)->NewGlobalRef(env, pClass);

根据局部对象pClass创建全局对象dpClass, 在程序结束后所有对象都会销毁, 内存会被释放. 也可以在JNI_OnUnload方法中释放

(*env)->DeleteGlobalRef(env, dpClass);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值