添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

像上面这样子是不行滴!

当我们不再使用引用类型时,应该收到释放掉,及时回收内存,虽然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