前言
NDK即Native Development Kit,是Google在Android开发中提供的用于快速创建native工程的一系列工具的集合,帮助开发者快速开发C/C++的动态库,并自动将so和java应用一起打包成apk,极大地减轻了开发人员的打包工作。
而我们经常还会听到JNI,那么JNI和NDK之间有什么区别呢?首先JNI即Java Native Interface,是Java语言提供的一种Java和C/C++通信机制,Java可以通过JNI来调用本地的C/C++代码,本地的C/C++可以通过JNI来调用Java代码。
总得来说,JNI是Java语言提供的一种特性,是Java调用native的一种机制,可以说JNI和Android并没有实质的关系。而NDK是Google公司帮助Android开发者通过C/C++编写应用的开发工具集合,包含了C/C++的头文件、库文件、说明文档和示例代码。
Android Studio CMake方式
Android Studio目前可以有两种方式配置NDK的开发环境,个人将其分为传统的配置方式和CMake方式
传统的配置方式需要配置Android.mk、Application.mk和gradle,这种方式复杂而且配置繁琐,在这里就不做赘述。这里要着重强调的是CMake方式,Android Studio 2.2已经对NDK开发做了很好的支持。下面介绍CMake方式:
首先创建工程,在Android Studio中File->New->New Project,会出现下图
这里我们需要注意的是将Include C++ support打上对勾,由于目前是最新的Android Studio(3.0),已经很好的支持了Kotlin,所以下面有Include Kotlin support,最好勾上,这样可以方便的进行Kotlin语言的开发。至于警告,是因为我这张图是为了展示给你们看,后来添加的,但是之前已经有这个程序了,可不用管。接下来就是Next->Next->Next->Next->Finish。
点开项目目录结构,可以看到Android Studio替我们多生成了三个文件夹,分别是.externalNativeBuild、cpp和CMakeLists.txt。
.externalNativeBuild是系统自动生成的,包含一些硬件信息,可以不用管。
cpp文件中默认是有一个C++文件native-lib.cpp,我们也可以自己手动添加C/C++文件,内容需要自己编写。下面是默认生成的,当然我们可以修改相应的代码。
CMakeList.txt是CMake脚步配置的文件,配置的是关于库的一些信息,需要自己配置。下面两张图就是默认生成的,我们需要注意的就是这里的native-lib需要和System.loadLibrary("native-lib")中的一致。首先需要说明的是#号是注释的意思,相当于//。add_library:创建一个library,添加C/C++文件;find_library:表示依赖NDK中的库,一般不需要手动去更改;target_link_libraries:表示将目标库与NDK中的库进行连接。如果有多个库时,可以添加多个add_library和target_link_libraries。
再来看看gradle配置:
最后来看Java代码:
这里需要注意的就是需要加上System.loadLibrary(...)去加载库文件,同时C/C++在Java中的声明必须加上native关键字。
下载NDK和构建工具
依次选择File -> Project Structure:
如果之前没有下载过NDK,会显示download NDK,点击就可以下载NDK,最终我的配置是这样的:
依次选择Tools -> Android -> SDK Manager -> SDK Tools:
依次选中CMake、LLDB和NDK。要编译和调试本地代码,需要这些组件。
NDK:让你能在Android上面使用C/C++代码的工具集,提供了一系列的工具,帮助开发者快速开发C/C++ ,极大地减轻了开发人员的打包工作。
CMake:外部构建工具。如果你准备只使用ndk-build的话,可以不使用它。
LLDB:Android Studio上面调试本地代码的工具。
一键生成方法名
当以上配置都完成时,编写一个Native方法,直接Alt + Enter就可以生成对应的方法,这样就可以在对应的C/C++文件中找到该函数的实现。