可以看到Android上层的Application和ApplicationFramework都是使用Java编写,底层包括系统和使用众多的LIiraries都是C/C++编写的。

所以上层Java要调用底层的C/C++函数库必须通过Java的JNI来实现。

1、众所周知,Android的应用层的类都是以Java写的,这些Java类编译为Dex文件之后,必须靠Dalvik虚拟机( Virtual Machine)来执行。假如在执行java程序时,需要载入C&C++函数时,Dalvik虚拟机就会去加载C&C++的库,(System.loadLibrary("libName");)让java层能顺利地调用这些本地函数。需要清楚一点,这些C&C++的函数并不是在Dalvik虚拟机中运行的,所以效率和速度要比在Dalvik虚拟机中运行得快很多

Dalvik虚拟机成功加载库之后,就会自动地寻找库里面的JNI_OnLoad函数,这个函数用途如下:

(1)告诉Dalvik虚拟机此C库使用哪一个JNI版本。如果你的库里面没有写明JNI_OnLoad()函数,VM会默认该库使用最老的JNI 1.1版本。但是新版的JNI做了很多的扩充,也优化了一些内容,如果需要使用JNI的新版功能,就必须在JNI_OnLoad()函数声明JNI的版本。

因为Dalvik虚拟机加载C库时,第一件事是调用JNI_OnLoad()函数,所以我们可以在JNI_OnLoad()里面进行一些初始化工作,如注册JNI函数等等。注册本地函数,可以加快java层调用本地函数的效率。

另外:与JNI_OnLoad()函数相对应的有JNI_OnUnload()函数,当虚拟机释放该C库时,则会调用JNI_OnUnload()函数来进行善后清除动作。

项目链接:http://download.csdn.net/detail/qq_28039537/9668409

最新文章

  1. ABP框架 - 实体
  2. IO多路复用之epoll总结
  3. 视频文件写入转换之图像处理-OpenCV应用学习笔记五
  4. 应用HTK搭建语音拨号系统4: 识别器评估
  5. HDU-敌兵布阵
  6. 自己签发免费ssl证书
  7. NGUI 新版操作教程
  8. node Later定时任务
  9. URLEncode转json
  10. Unity3D文件读写
  11. Codevs 1158 尼克的任务
  12. xml约束DTD演示
  13. [Python笔记]第九篇:re正则表达式
  14. Linux中搭建SVN服务器
  15. SVD在推荐系统中的应用
  16. JAVA写接口傻瓜(?)教程(一)
  17. Vmware12安装centos系统详解
  18. Python_老男孩练习题1
  19. Tools:apache部署https服务
  20. 前端框架之Vue(7)-事件处理

热门文章

  1. 关于arcengine中geoprocessor使用的困惑
  2. Bootstrap<基础二> 网格系统
  3. powershell读写磁盘变量(对象序列化)
  4. 解决eclipse中自带的maven搜索不到非本地第三方包问题
  5. VS2012 调试时 局部变量显示不全的问题解决
  6. JavaScript WEB页面调试
  7. JPA原理理解
  8. Java 单列模式(Singleton)
  9. 关于GridView的第一个item图片加载不出来问题
  10. github的使用步骤及体会