Android NDK开发之旅(1):Eclipse中NDK环境搭建与JNI开发流程
(码字不易,转载请表明出处:http://blog.csdn.net/andrexpert/article/details/72626830)
前言
看着本篇文章的标题,或许你会问现在AndroidStudio版本都更新到3.0了,从2.2开始就可以直接使用Cmake来构建NDK项目,根本没有必要再去研究NDK在Eclipse中的开发。嗯,在我使用过AndroidStudio构建NDK项目后,我也是这种想法,通过cmake编译C/C++代码来构建NDK开发框架确实是非常智能、步骤也很简单,完全可以秒杀Eclipse。但是,对于从来没有开发NDK项目的人来说,直接上AS开发可能一是无法明白这其中的原理,比如Android项目是如何构建C/C++开发环境的、Java层和C/C++层是如何映射的等等,这就是我打算写这篇文件的原因。
1. NDK/JNI简介
AndroidFramework由基于Java语言的Java层与基于C/C++语言的C/C++层组成,在某些情况下,为了将Java(上层)与C/C++(底层)有机地联系起来,使得他们相互协调,共同完成某些任务,Android引入了Java本地接口(JNI,JavaNative interface),它允许Java代码与基于C/C++编写的应用程序、模块和库进行交互操作。在AndroidFramework中,借助JNI综合了Java语言与C/C++等本地语言的优点,使得开发者既可以利用Java语言跨平台、类库丰富、开发便捷等特点,又可以利用本地语言开发运行效率更高、更健壮、更安全的程序。使用JNI几种情况:
(1)注重处理速度(栈、堆速度区别)
与本地代码(C/C++等)相比,Java代码的执行速度要慢一些。如果对某段程序的执行速度有较高的要求,建议使用C/C++编写代码。而后在Java中通过JNI调用基于C/C++编写的部分,常常能够获得很快的运行速度。
(2)硬件控制
为了更好地控制硬件,硬件控制代码通常使用C语言编写。而后借助JNI将其与Java层连接起来,从而实现对硬件的控制。另外,假如搭载Android的设备上安装AndroidFramework不支持的硬件时,可以使用C语言实现设备的驱动程序,以便对设备进行控制。
(3)既有C/C++代码的复用
在程序编写过程中,常常会使用一些已经编写好的C/C++代码,既提高了编程效率,又确保了程序的安全性与健壮性,在复用这些C/C++代码时,就要通过JNI来实现。
(4)防止被反编译,提高app安全性
2. NDK开发环境配置
* NDK:android-ndk-r10c(32位)
* JDK:jdk1.8.0_20(32位)
* NDK插件:com.android.ide.eclipse.ndk_23.0.7.2120684.jar
com.android.ide.eclipse.ndk.feature_23.0.7.2120684(目录)
(1) 配置环境变量
将JDK和NDK相关路径配置到环境变量中,需要注意的是,JDK的版本要与NDK版本一致,否则会报错,比如系统是64位那么JDK和NDK应该都是64位的版本。path变量添加:;%NDK_HOME%;%JAVA_HOME%;%JAVA_HOME%\include;%JAVA_HOME%\bin;%JAVA_J