Android JNI编程提高篇之一
2010-12-18 08:04:05 来源:WEB开发网Simon在拙文《Android JNI开发入门之二》中提到了,Android JNI开发的深入学习的一些资料和方法。最近Simon在学习《Java Native Interface: Programmer’s Guide and Specification》,在学习过程中发现在JNI规范中关于引用部分是最难理解的,恕Simon愚钝,看了两遍才对其思想略有理解,在此和大家分 享我对JNI规范中引用部分的理解,如果有错误之处,希望能和各位网友一起探讨。
什么是JNI规范中对象引用
在JNI编程中,Native代码不能对Java虚拟机中对象的内存分布有任何假设。因为Java虚拟机可以根据自己的策略定义自己对象的内存布局。这就要求JNI规范有如下要求:
1、如果要在Native代码中生成Java对象,则必须调用Java虚拟机的JNI接口来生成。
2、对Java对象的操作也需要调用Java虚拟机的JNI接口来进行。
3、在Native代码中,通过引用来访问Java对象。对象引用有Java虚拟机的JNI接口返回,比如:NewStringUTF函数,用utf8的字符串创建一个Java字符串对象,在Native代码中以jstring类型的引用来访问它。
JNI规范中的引用和Java中应用有类比关系,大家可以相互对照。
JNI引用的分类
JNI规范中定义了三种引用——局部引用(Local reference),全局引用(Global reference),弱全局引用(Weak global reference)。
这算三种引用的生存期是不同的,全局引用和弱全局引用的生存期为创建之后,到程序员显示的释放他们。局部引用会被Java虚拟机在当前上下文(可以理解成Java程序调用Native代码的过程)结束之后自动释放。
全局引用和局部引用将会迫使Java虚拟机不会垃圾回收其指向的对象。而弱全局引用指向的对象可以被Java虚拟机垃圾回收。
每种引用都有自己的用途,比如当Native函数返回的时候,需要返回局部引用(和C语言的局部变量要区分开)。全局引用和弱全局引用用来缓存 Class ID,Field ID,Method ID等全局数据(共享库加载到共享库卸载这个过程中,这些数据是固定不变的)。
局部引用
这里重点要强调一下局部引用的有效期,很多有C语言背景的程序员会认为当Native函数结束之后局部引用就无效了,和C语言的局部变量对应。 实际上JNI中的局部引用和C语言中局部变量是不同的,他的有效期是当前Native函数被调用的上下文中。我理解的调用上下文,为Java虚拟机的调用 流程。Native函数是被Java虚拟机调用的,Native函数执行完成之后,控制流程将继续返回给Java虚拟机。局部变量在Native函数中,
更多精彩
赞助商链接