从编程语言上来讲,Android Framework是由java编写的java层以及C/C++编写的native层组成。其中java层可以调用C/C++的函数,而C/C++也可以调用j或者访问ava层的函数、变量等,在这两层之间充当连接桥梁的角色就是java本地接口(JNI,Java Native Interface)。
JNI是一种本地编程接口。它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如应用与使用C、C++、汇编等语言编写的应用程序、模块、库之间进行交互操作。
通常业界会在以下情况下使用JNI:
- 注重处理速度,与本地代码(C/C++)相比,Java代码的执行速度会慢一些, 如果对某段代码的执行速度有较高的要求,建议使用C/C++编写代码。
- 硬件控制, 为了更好的控制硬件,硬件的控制代码通常使用C语言来编写,通过JNI将其与Java层连接起来,从而实现对硬件的控制。
- 复用既有的C/C++代码,在进行开发时,常常会有一些已经编写好的C/C++代码,通过复用该代码,可以大大提高开发效率,所以此时也会通过JNI来实现。
在Android平台下,若想进行JNI编程,就会用到由谷歌公司开发的一个工具集(NDK),开发者利用该工具集可以轻松的开发出基于JNI机制的应用,该工具集中通常提供如下功能.
ndk-build : 此脚本用于在 NDK 中心启动构建脚本。包含功能:
- 自动探测开发系统和应用项目文件以确定要构建的内容
- 生成二进制文件
- 将二进制文件复制到应用的项目路径
- 原生共享库:NDK 从原生源代码构建这些库或 .so 文件
- 原生静态库:NDK 也可以构建静态库或 .a 文件
- Java 原生接口(JNI):JNI 是 Java 和 C++ 组件用以互相沟通的接口
- 应用二进制界面(ABI):定义应用的机器代码在运行时如何与系统交互。NDK 根据这些定义构建.so 文件。不同的 ABI 对应不同的架构
- 清单:如果应用没有 Java 组件 ,必须在清单中声明 NativeActivity 类
- Android.mk :必须在 jni 文件夹内创建 Android.mk 配置文件。ndk-build 脚本将查看此文件,其中定义了模块及其名称、要编译的源文件、版本标志以及要链接的库。
- Application.mk :此文件枚举并描述应用需要的模块。包括:用于针对特定平台进行编译的 ABI
- 工具链
- 要包含的标准库
本文档教大家如何进行JNI编程:
1: 首先创建工程NativeHello
创建包含native方法的类
注意: System.loadLibrary在NativeClass被加载时会调用.
3:创建JNI头文件
4: 创建Android.mk
5: 创建NativeClass.cpp,并编写JNI接口方法
6: 在jni目录执行ndk-build,编译库文件
7: 执行该APP,输出结果: