记录一次jni内存泄漏

关于jni如何才能不泄露内存的基本原则:

  1. c/c++分配的资源,一律需要自己管理(可以用智能指针管理起来,或者用RAII思想管理),否则一定会存在内存泄漏
  2. jni api分配的资源,若是c/c++类型,需要自己管理,因为这些变量分配在jni heap上,java不会帮你管理。若是java类型(jstring/jobject等各种j开头的类型),这些变量分配在java heap上,java的GC会帮你回收。

我本次的内存泄漏是上述第2点导致,即,我通过GetStringUTFChars从jstring得到char*,最后没有去释放c/c++的char*,导致了内存泄漏。随后我使用ReleaseStringUTFChars释放该对象后,内存泄漏现象消失。

总之,jni层,申请资源/释放资源需要一一匹配,否则就很可能会导致内存泄漏。

jni的很多api都是成对出现,如GetStringUTFCharsReleaseStringUTFChars等等,在函数返回之前,一定要及时释放申请的资源(可用RAII手段轻松做到)。

具体的需要成对调用的jni api可参考下面的链接。

注意:不能重复多次释放资源(例如多次对同一对象调用ReleaseStringUTFChars),否则程序会crash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值