像上面这样子是不行滴!
当我们不再使用引用类型时,应该收到释放掉,及时回收内存,虽然return后会释放内存,但是垃圾回收不够及时。
在本机方法返回后,使用虚拟机删除16个本地引用是可以接受的!
2.全局变量引用
2.1强引用
对于全局变量的引用需要调用
NewGlobalRef方法。
2.2弱引用
而对于弱引用也是类似,需要调用(*env)->NewWeakGlobalRef()方法。
2.3引用对象的比较
引用对象的比较,需要调用
(*env)->IsSameObject(env, obj1, obj2)方法进行比较即可。
3.引用的释放
3.1局部变量引用的释放
当引用对象不使用的时候,我们需要尽快的释放内存,以提高内存使用率。调用
(*env)->DeleteLocalRef(env, object);方法。尤其是对于大内存数据的引用。
当需要处理大内存文件,或者循环创建变量时,需要确保有足够的内存空间来创建变量,调用
EnsureLocalCapacity方法。
或者是,我们可以调用
Push/PopLocalFrame方法,来限制局部变量的内存大小,例如:
通过
PushLocalFrame方法创建一个新的变量的最大范围,通过
PopLocalFrame方法来释放所有局部变量内存。
3.2释放全局变量
强引用全局变量的释放:
DeleteGlobalRef,而弱引用的释放:
DeleteWeakGlobalRef。当全局变量不再需要使用了,就需要调用相对应的释放方法来立即释放内存。
1.当你在写本地方法的时候,需要小心不要遗漏了任何局部变量的释放,因为这个方法可能被多次调用,而导致内存溢出。
2.当我们需要缓存全局变量时,保证可以多次调用,也可以多线程调用时,可以这么写
JNI
ENV *env 无法在多线程之间进行传递,这时就需要为原生线程生成新的
JNI
ENV指针
需要先保存一个JavaVM的
全局变量
。如果需要保存Java全局对象则需要创建一个全局的jobject对象。
JavaVM *g_jvm = NULL;
jobject g_obj = NULL;
env->GetJavaVM(&g_jvm);
JNI
ENV*env
//Attach...
之前的
JNI
学习文章《
JNI
异常处理和缓存策略》中有介绍过
全局变量
,在本文中将派上用用场,直接使用。本次实战主要是在C层开辟子线程,然后通过访问java类,获取得到UUID,并且打印出来。具体步骤:1、创建一个NDK项目,编写native方法NDKTest.javapublic class NDKTest {public native static String getStrFrom
JNI
();/...
extern "C"
JNI
EXPORT void
JNI
CALL
Java_com_shaoshuaima_test_
Jni
ForC_cached(
JNI
Env * env, jobject jobj){
jclass cls = env->GetObjectClass(jobj);
####一、使用局部的static
变量
:
JNI
EXPORT void
JNI
CALL Java_com_test_
Jni
Test_cache
(
JNI
Env * env, jobject jobj){
static jfieldID fid = NULL;
jclass clz = (*env)->GetObjectClass(env, jobj);
在
JNI
去调用 Java 的方法和访问字段时,最先要做的操作就是获得对应的类以及对应的方法 id。事实上,通过 FindClass 、GetFieldID、GetMethodID 去找到对应的信息是很耗时的,如果方法被频繁调用,那么肯定不能每次都去查找对应的信息,有必要将它们缓存起来,在下一次调用时,直接使用缓存内容就好了。缓存有两种方式,分别是使用时缓存和初始化时缓存。使用时缓存使用时缓存,...
从Java虚拟机创建的对象传到本地 C/C++ 代码时就会产生
引用
。根据Java的垃圾回收机制,只要有
引用
存在就不会触发该
引用
指向的Java对象的垃圾回收。这些
引用
在
JNI
中分为三种全...
JNI
对象在函数调用中的生命周期恽 益群2007 年 12 月 06 日发布问题在
JNI
编程中常需要从一个普通的 C/C++ 函数中调用
JNI
方法,比如:long ProcessKeyboardEventInJava(int keyboardEvent){long error = 0;
JNI
Env* env = g_env;jclass that = g_class;...
JNI
规范中定义了三种
引用
——全局
引用
(Global reference),局部
引用
(Local reference),弱全局
引用
(Weak global reference)。
这算三种
引用
的生存期是不同的。
全局
引用
的生存期为创建之后,直到程序员显式的释放它。
局部
引用
的生存期为创建后,直到程序员显式的释放他们,或在当前上下文(可以理解成Java程序调用Na