android NDK的学习
一、NDK概述
NDK是基于系统原生的C/C++的开发,但是它不是一种主流,而是Android SDK开发的有益补充,因为NDK没有提供界面,也没有提供生命周期管理这一类环境。
1、NDK和JNI的关系
NDK是一系列的工具包,使用这些工具包能够让我们很方便的进行JNI的开发
2、什么是JNI
Java native interface,JNI就是java和C/C++相互调用的接口
JNI的定位在于C和Java的接口,而不是要你专注去做C的开发
JNI起源于JVM虚拟机(java虚拟机的作用屏蔽掉java语言的不同,让java能在不同的操作系统上运行)
3、JNI应用的场合
a、需要与操作系统底层交互的时候,因为操作系统的底层全部都是用C编写的代码,应用层如果需要调用操作系统底层的代码时,就需要用JNI。
b、对于运算速度有要求的时候,我们会把这一部分代码用C实现,再用Java去调用,这样子就可以获取更高的性能。如:音频视频的解码、Android上游戏的核心算法,大部分游戏都会把核心算法用C来实现然后在游戏引擎上层调用这些核心算法
C、已经有现成的C的代码实现的时候,如:openGl、ffmpeg
4、JNI的问题
a、JNI的代码比较复杂,使用不方便
b、容易导致内存的泄露,严重的时候可能导致虚拟机的崩溃(所以JNI开发需要慎重)
c、用JNI开发导致应用程序不能跨平台
d、JNI是由虚拟机来底层实现的,所以没有虚拟机就不能运行JNI
二、JNI第一个实例
用Java调用C的代码,C的代码必须要封装成动态链接库的形式,动态链接库在windows上的后缀名是dll,而在linux上是so
(所有java调用C的代码都用native标识)
1.在java代码用native标示C中需要被调用的方法
2.编译java源文件,形成class文件;
3.用javah -jni处理class文件形成头文件
4.创建C的工程,将生成的头文件拷贝过来
5.根据头文件里的方法声明写方法实现
6.到jdk的include目录下,将jni.h和jni-md.h两个文件拷贝到工程下;
7.编译生成dll或so
8.将生成的dll或so加入到环境变量中
9.在java源代码中通过system.loadlibrary加载dll或so,且dll名称后面 不需要后缀名
10.加载完毕之后,重新启动eclipse