android NDK的学习

来源:互联网 发布:形容程序员优秀的词语 编辑:程序博客网 时间:2024/05/17 08:41

一、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

 

 

三、深入学习NDK

1、创建HelloJni.java

a、加载库(静态库、动态库)

b、声明原生函数

c、调用该原生函数

2、使用javah-jni命令生成C语言头文件