jvm何时退出?jni启动的jvm实例是作为子进程存在的,只要主进程仍然存在,那么jvm子进程就存在,不会退出,因此我们才不需要多次创建jvm实例。??
JNI的起源??
Jvm封装了各种操作系统实际的差异性的同时,提供了jni技术,使得开发者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过jni提供的相应原生接口开调用java应用系统内部实现的功能。
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与 平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
Jni对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用c/c++来实现一个代理程序(jni程序)来实际操作目标原生函数,java程序中则是jvm通过加载并调用此jni程序来间接地调用目标原生函数。
--------------------------------------
Android通过把系统划分为几个层次从而使得开发者可以使用平台无关的Java语言进行Android应用开发,不必关心程序实际的硬件环境。 Google不仅为开发者提供了SDK开发套件,为了能让开发者使用C/C++编写的本地化的共享库,利用编译后的共享库更高效的完成计算密集型的操作来提高应用的性能,或者移植重用已有的C/C++组件,提高开发效率,Android 1.5之后,又推出了NDK(Native Development Kit)。有了NDK,开发者能够在Android平台上使用JNI(Java Native Interface)技术,实现应用程序中调用本地二进制共享库。 由于Android系统不同于以往的JNI使用环境而是在嵌入式硬件环境下,Android NDK提供了一套交叉编译工具链,和构建程序的工具方便开发者在桌面环境下编译目标平台的二进制共享库。 目前NDK提供了对ARMv5TE,ARMv7-A,x86和MIPS指令集平台的支持,同时在本地接口的支持上,目前以下本地接口支持
- libc
- libm
- libz
- liblog
- OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
- libjnigraphics (Pixel buffer access) header (Android 2.2 以上可用).
- C++头文件的一个子集
- Android native应用API接口
- JNI头文件接口
由上面的介绍,我们可以知道,实际上NDK开发是以JNI技术为基础的,因此要求开发者必须要掌握基本的JNI技术,这样才能进行有效的NDK开发。
JNI技术简介
JNI(Java Native Interface)是Java SDK 1.1时正式推出的,目的是为不同JVM实现间提供一个标准接口,从而使Java应用可以使用本地二进制共享库,扩充了原有JVM的能力,同时Java程序仍然无需再次编译就可以运行在其他平台上,即保持了平台独立性又能使用平台相关的本地共享库提升性能。在Java开发中的位置如下图所示。JNI作为连接平台独立的Java层(以下简称Java层)与与平台相关的本地环境(以下简称Native层)之间的桥梁。
实际上在Android内部就大量的使用了JNI技术,尤其是在Libraries层和Framework层。
何时使用Android NDK
Google在其文档提到了NDK不能让大多数应用获益,其增加的复杂度远大于获得的性能的代价。Google建议当需要做大量的cpu密集同时少量存储操作或者重用C/C++代码时可以考虑使用NDK。 本文的余下部分将具体介绍Android平台下通过NDK的支持的如何进行JNI的开发。