JNI局部变量和全局变量引用

转载请注明本文出自文韬_武略的博客(http://blog.csdn.net/fwt336/article/details/60867414),请尊重他人的辛勤劳动成果,谢谢!


1.局部变量引用

定义在本地方法内的局部变量,会随着方法调用完return后,局部变量也会随着被释放。

所以,不要在本地方法中定义static变量来存储数据!举个栗子:

JNI局部变量和全局变量引用_第1张图片

像上面这样子是不行滴!

当我们不再使用引用类型时,应该收到释放掉,及时回收内存,虽然return后会释放内存,但是垃圾回收不够及时。

在本机方法返回后,使用虚拟机删除16个本地引用是可以接受的!

2.全局变量引用

2.1强引用

对于全局变量的引用需要调用NewGlobalRef方法。

JNI局部变量和全局变量引用_第2张图片

2.2弱引用

而对于弱引用也是类似,需要调用(*env)->NewWeakGlobalRef()方法。

2.3引用对象的比较

引用对象的比较,需要调用(*env)->IsSameObject(env, obj1, obj2)方法进行比较即可。


3.引用的释放

3.1局部变量引用的释放

当引用对象不使用的时候,我们需要尽快的释放内存,以提高内存使用率。调用(*env)->DeleteLocalRef(env, object);方法。尤其是对于大内存数据的引用。

例如:

JNI局部变量和全局变量引用_第3张图片

当需要处理大内存文件,或者循环创建变量时,需要确保有足够的内存空间来创建变量,调用EnsureLocalCapacity方法。

JNI局部变量和全局变量引用_第4张图片

或者是,我们可以调用Push/PopLocalFrame方法,来限制局部变量的内存大小,例如: JNI局部变量和全局变量引用_第5张图片  

通过PushLocalFrame方法创建一个新的变量的最大范围,通过PopLocalFrame方法来释放所有局部变量内存。


3.2释放全局变量

  强引用全局变量的释放:DeleteGlobalRef,而弱引用的释放:DeleteWeakGlobalRef。当全局变量不再需要使用了,就需要调用相对应的释放方法来立即释放内存。


注意:

1.当你在写本地方法的时候,需要小心不要遗漏了任何局部变量的释放,因为这个方法可能被多次调用,而导致内存溢出。

2.当我们需要缓存全局变量时,保证可以多次调用,也可以多线程调用时,可以这么写

JNI局部变量和全局变量引用_第6张图片


你可能感兴趣的:(安卓开发,NDK开发)