1、基础概念
1.1、JNI
JNI(Java Native Interface)Java本地接口,使得Java与C/C++具有交互能力
1.2、NDK
NDK(Native Development Kit) 本地开发工具包,允许使用原生语言(C和C++)来实现应用程序的部分功能
Android NDK开发的主要作用:
1、特定场景下,提升应用性能;
2、代码保护,增加反编译难度;
3、生成库文件,库可重复使用,也便于平台、项目间移植;
1.
2.
3.
1.3、CMake与ndk-build
当我们基于NDK开发出native功能后,通常需要编译成库文件,给Android项目使用。
目前,有两种主流的编译方式:CMake__与__ndk-build
__CMake__与__ndk-build__是两种不同的编译工具(与Android代码和C/C++代码无关)
CMake
CMake是Androidstudio2.2之后引入的跨平台编译工具(特点:简单易用,2.2之后是默认的NDK编译工具)
如何配置:
1、创建CMakeLists.txt文件,配置CMake必要参数;
2、使用gradle配置CMakeLists.txt以及native相关参数;
如何编译库文件:
1、Android Studio执行Build即可;
1.
2.
3.
4.
5.
6.
7.
8.
ndk-build
ndk-build是NDK中包含的脚本工具(可在NDK目录下找到该工具,为了方便使用,通常配置NDK的环境变量)
如何配置:
1、创建Android.mk文件,配置ndk-build必要参数;
2、可选创建application.mk文件,配置ndk-build参数 (该文件的配置项可使用gradle的配置替代);
3、使用gradle配置Android.mk以及native相关参数;
2、如何编译库文件(两种方式):
1、Android Studio执行Build即可(执行了:Android.mk + gradle配置);
2、也可在Terminal、Mac终端、cmd终端中通过ndk-build命令直接构建库文件(执行了:Android.mk)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
2、环境搭建
JNI安装
JNI 是JDK里的内容,电脑上正确安装并配置JDK即可 (JDK1.1之后就正式支持了);
NDK安装
可从官网自行下载、解压到本地,也可基于AndroidStudio下载解压到默认目录;
编译工具安装
cmake 可基于AndroidStudio下载安装;
ndk-build 是NDK里的脚本工具,NDK安装好即可使用ndk-build;
当前演示,使用的Android Studio版本如下(当前最新版):
启动Android Studio --> 打开SDK Manager --> SDK Tools,如下图所示:
我们选择NDK、CMake、LLDB(调试Native时才会使用),选择Apply进行安装,等安装成功后,NDK开发所依赖的环境也就都齐全了。
3、Native C++ 项目(HelloWord案例)
3.1、项目创建(java / kotlin)
新建项目,选择 Native C++,如下图:
新创建的项目,默认已包含完整的native 示例代码、cmake配置 ,如下图:
这样,我们就可以自己定义Java native方法,并在cpp目录中写native实现了,很方便。
但是,当我们写完native的实现代码,希望运行APP,查看JNI的交互效果,此时,就需要使用编译工具了,咱们还是先看一下Android Studio默认的Native编译方式吧:CMake
3.2、CMake的应用
在CMake编译之前,咱们应该先做哪些准备工作?
1、NDK环境是否配置正确?
-- 如果未配置正确是无法进行C/C++开发的,更不用说CMake编译了
2、C/C++功能是否实现?
-- 此次演示主要使用系统默认创建的native-lib.cpp文件,关于具体如何实现:后续文章再详细讲解
3、CMakeLists.txt是否创建并正确配置?
-- 该文件是CMake工具编译的基础,未配置或配置项错误,均会影响编译结果
4、gradle是否正确配置?
-- gradle配置也是CMake工具编译的基础,未配置或配置项错误,均会影响编译结果
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
除此之外,咱们还应该学习CMake的哪些重要知识?
1、CMake工具编译生成的库文件默认在什么位置?apk中库文件又是在什么位置?
2、CMake工具如何指定编译生成的库文件位置?
3、CMake工具如何指定生成不同CPU平台对应的库文件?
1.
2.
3.
带着这些问题,咱们开始CMake之旅吧:
3.2.1、NDK环境检查
编译前,建议先检查下工程的NDK配置情况(不然容易报一些乱七八糟的错误):
File --> Project Structure --> SDK Location,如下图(我本地的Android Studio默认没有给配置NDK路径,那么,需要自己手动指定一下):
3.2.2、C/C++功能实现
因为本节主讲CMake编译工具,代码就不单独写了,咱们直接使用工程默认生成的native-liv.cpp,简单调整一