Android JNI与VM交互详解
"JNI与Android VM的关系" JNI(Java Native Interface)是Java平台中用于与本地代码(通常是C/C++)交互的一种接口。在Android系统中,由于应用的主要部分是用Java编写并运行在Dalvik或ART(Android RunTime)虚拟机上,但有时为了性能优化或者访问操作系统底层功能,开发者会需要用到JNI来调用本地库。 Android中的JNI工作流程大致如下: 1. **加载.so文件**: 当Java代码中通过`System.loadLibrary()`方法指定一个动态链接库(如`.so`文件)的名称时,Android的虚拟机会负责加载这个库。例如,`System.loadLibrary("media_jni");`会加载`/system/lib/libmedia_jni.so`。加载完成后,Java类和.so文件就可以协同工作了。 2. **JNI-OnLoad()与JNI-OnUnload()**: 当虚拟机执行到`System.loadLibrary()`时,会寻找并执行.so文件中的`JNI_OnLoad()`函数。这个函数有两大作用: - **指定JNI版本**:`JNI_OnLoad()`告诉虚拟机当前.so文件使用的JNI版本。如果不提供此函数,虚拟机将默认使用最早的JNI 1.1版本。若需利用新的JNI特性,如JNI 1.4的`java.nio.ByteBuffer`,则必须在`JNI_OnLoad()`中设置。 - **初始化**:`JNI_OnLoad()`也是C组件初始化的好时机,开发者可以在这里进行必要的设置,例如分配内存、注册JNI函数等。 3. **JNI函数注册**: 在`JNI_OnLoad()`中,通常会调用`RegisterNatives()`或使用静态初始化块(`static {}`)来注册Java类中的native方法对应的本地实现。这样,Java代码就可以通过JNI调用这些本地方法。 4. **Java与C/C++的通信**: 一旦库被加载并且函数注册完成,Java代码就可以通过`native`关键字声明的方法来调用C/C++代码。在C/C++侧,这些方法通过JNI函数如`JNIEnv*`指针提供的API实现,例如`FindClass()`, `GetMethodID()`, `CallVoidMethod()`等。 5. **JNI性能考虑**: 虽然JNI提供了与本地代码的直接交互,但频繁的Java-C-C++-Java调用会导致性能开销。因此,通常建议将计算密集型或与硬件交互的任务放在本地代码中,并尽量减少跨语言的通信。 6. **卸载库**: 当应用程序不再需要本地库时,可能不会像加载那样有一个明确的调用。在某些情况下,比如进程退出,Android系统可能会调用`JNI_OnUnload()`来释放资源,但这个行为并不保证。因此,开发者不应依赖`JNI_OnUnload()`来进行必要的清理工作,而应在需要时显式管理资源。 总结起来,JNI是Android开发中一个重要的工具,它使得Java应用程序能够利用本地库的功能,同时,理解JNI与Android虚拟机之间的交互机制对于优化性能和解决兼容性问题至关重要。
下载后可阅读完整内容,剩余4页未读,立即下载
- 粉丝: 3
- 资源: 19
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多传感器数据融合手册:国外原版技术指南
- MyEclipse快捷键大全,提升编程效率
- 从零开始的编程学习:Linux汇编语言入门
- EJB3.0实例教程:从入门到精通
- 深入理解jQuery源码:解析与分析
- MMC-1电机控制ASSP芯片用户手册
- HS1101相对湿度传感器技术规格与应用
- Shell基础入门:权限管理与常用命令详解
- 2003年全国大学生电子设计竞赛:电压控制LC振荡器与宽带放大器
- Android手机用户代理(User Agent)详解与示例
- Java代码规范:提升软件质量和团队协作的关键
- 浙江电信移动业务接入与ISAG接口实战指南
- 电子密码锁设计:安全便捷的新型锁具
- NavTech SDAL格式规范1.7版:车辆导航数据标准
- Surfer8中文入门手册:绘制等高线与克服语言障碍
- 排序算法全解析:冒泡、选择、插入、Shell、快速排序