AndroidJNI编程提高篇之一.docVIP

  • 4
  • 0
  • 约4.88千字
  • 约 6页
  • 2018-03-09 发布于河南
  • 举报
AndroidJNI编程提高篇之一

 HYPERLINK /~Simon_fu/?p=849 \o Permanent link to Android JNI编程提高篇之一 Simon在拙文《 HYPERLINK /~Simon_fu/?p=836 Android JNI开发入门之二》中提到了,Android JNI开发的深入学习的一些资料和方法。最近Simon在学习《 HYPERLINK /docs/books/jni/ 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语言的局部变量要区分开)。全局引用和弱全局引用在多线程之间共享其指向的对象等。 局部引用 这里重点要强调一下局部引用的有效期,很多有C语言背景的程序员会认为当Native函数结束之后局部引用就无效了,和C语??的局部变量对应。实际上JNI中的局部引用和C语言中局部变量是不同的,他的有效期是当前Native函数被调用的上下文中。我理解的调用上下文,为Java虚拟机的调用流程。Native函数是被Java虚拟机调用的,Native函数执行完成之后,控制流程将继续返回给Java虚拟机。局部变量在Native函数中,由Native代码调用Java虚拟机的JNI接口创建,秉着谁创建谁销毁的原则(软件设计一个常用规则),当Native函数执行完成之后,如果局部引用没有被Native代码显示删除,那么局部引用在Java虚拟机中还是有效的。Java虚拟机来决定在什么时候来删除这个对象。这和C语言的局部变量概念是不同的。这也可以解释为什么Natvie函数能够以一个局部引用为返回值了。 JNI编程中,局部引用是最常被用到的概念。比如:大部分JNI函数都返回一个局部引用,所以局部引用概念理解正确非常重要。 局部引用在Native代码显示释放非常重要。你可能会问,既然Java虚拟机会自动释放局部变量为什么还需要我在Native代码中显示释放呢?原因有以下几点: 1、Java虚拟机默认为Native引用分配的局部引用数量是有限的,大部分的Java虚拟机实现默认分配16个局部引用。当然Java虚拟机也提供API( HYPERLINK /javase/1.5.0/docs/guide/jni/spec/functions.html \l push_local_frame PushLocalFrame, HYPERLINK /javase/1.5.0/docs/guide/jni/spec/functions.html \l ensure_local_capacity EnsureLocalCapacity)让你申请更多的局部引用数量(Java虚拟机不保证你一定能申请到)。有限的资源当然要省着点用,否则将会被Java虚拟机无情抛弃(程序崩溃)。JNI编程中,实现Native代码时强烈建议调用 HYPERLINK /javase/1.5.0/docs/guide/jni/spec/fun

文档评论(0)

1亿VIP精品文档

相关文档