android – Native C库 – 谁必须释放内存以及如何?

android – Native C库 – 谁必须释放内存以及如何?,第1张

概述这是关于 Android的.情况: C库和java包装器类以及用于处理库中C类的本机函数(JNI).当常见的Java代码需要C对象时,它会创建相应的java包装器对象,该对象通过本机函数创建C对象,并在“long”变量中记住指向本机对象的指针.在所有下一个 *** 作中,包装器将此指针指向本机函数等. 问题: 如何在最后释放所有分配的C对象?目前,每个包装类都有’finalize’方法,它调用本机函数来释 这是关于 Android的.情况:

C库和java包装器类以及用于处理库中C类的本机函数(JNI).当常见的Java代码需要C对象时,它会创建相应的java包装器对象,该对象通过本机函数创建C对象,并在“long”变量中记住指向本机对象的指针.在所有下一个 *** 作中,包装器将此指针指向本机函数等.

问题:

如何在最后释放所有分配的C对象?目前,每个包装类都有’finalize’方法,它调用本机函数来释放C对象,但AndroID不保证调用’finalize’!另一方面,通常C库不知道java代码分配了多少和哪些类型的C对象.

当我们的Java应用程序终止时,剩下的已分配内存将会发生什么,当 *** 作系统卸载库时,AndroID会自动释放从本机库使用的整个堆吗?

解决方法 在进程生命周期结束时,系统将释放并回收所有进程内存(Java和C堆).但有一点是,AndroID活动结束并不一定会结束这个过程.我不确定那里的流程关闭政策是什么.

另一方面,依赖于垃圾收集和finalize()听起来像是坚实的设计.你声称 – “AndroID不保证finalize()”.你有没有引用它?因为如果它附带免责声明“当对象作为进程关闭的一部分被释放时……”,那么我们仍然很好.

如果你是超级偏执狂,你可以编写自己的malloc()/ free()/ realloc()包装器,存储所有已分配对象的列表,并引入一个清理函数,遍历列表并释放它们.但是,包含Java对象可能以一种奇怪的僵尸状态结束,其中内存已从其下面释放.这是一个很容易出错的棘手主张.所以我仍然会说 – 对垃圾收集器有信心.缺乏这将是令人不安的.

总结

以上是内存溢出为你收集整理的android – Native C库 – 谁必须释放内存以及如何?全部内容,希望文章能够帮你解决android – Native C库 – 谁必须释放内存以及如何?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1128423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存