Android JNI编程提高篇之一
2010-12-18 08:04:05 来源:WEB开发网核心提示:PushLocalFrame,然后创建局部引用,Android JNI编程提高篇之一(3),并对其进行处理,最后调用PushLocalFrame释放局部引用,,本文叙述了JNI规范中局部引用的理解,这时Java虚拟机也可以对其指向的对象进行垃圾回收,可以用C语言的栈来理解这对JNI API
PushLocalFrame,然后创建局部引用,并对其进行处理,最后调用PushLocalFrame释放局部引用,这时Java虚拟机也可以对其指
向的对象进行垃圾回收。可以用C语言的栈来理解这对JNI
API,调用PushLocalFrame之后Native代码创建的所有局部引用全部入栈,当调用PopLocalFrame之后,入栈的局部引用除了
需要返回的局部引用(PushLocalFrame和PopLocalFrame这对函数可以返回一个局部引用给外部)之外,全部出栈,Java虚拟机这
时可以释放他们指向的对象。具体的用法可以参考手册。这两个函数使JNI的局部引用由于和C语言的局部变量用法类似,所以强烈推荐使用。
当创建局部变量之后,将迫使Java虚拟机不对其指向的对象进行垃圾回收,直到Native代码显示调用了DeleteLocalRef删除局 部引用。Native代码调用DeleteLocalRef显示删除局部引用之后,Java虚拟机就可以对局部引用指向的对象垃圾回收了。当Native 代码创建了局部引用,但未显示调用DeleteLocalRef删除局部引用,并返回Java虚拟机的话,那么由虚拟机来决定什么时候删除该局部引用,然 后对其指向的对象垃圾回收。程序员不能对java虚拟机删除局部引用的时机进行假设。
局部引用仅仅对于java虚拟机当前调用上下文有效,不能够在多次调用上下文中共享局部引用。这句话也可以这样理解:局部引用只对当前线程有 效,多个线程之间不能共享局部引用。局部引用不能用C语言的静态变量或者全局变量来保存,否则第二次调用的时候,将会产生崩溃。。
本文叙述了JNI规范中局部引用的理解,后续文章我们将会继续关注全局变量和弱全局变量。
更多精彩
赞助商链接