随着工作时间越久,接触关于Android系统越深入(日常开源项目使用,及解系统BUG),JNI与NDK开发出现的频率越来越多。目前,越来越多公司对于代码执行效率、核心代码的保密性要求日益提高,加之各种C 、C++开源项目的不断接入。使得Android开发中,对于JNI的使用甚至NDK的开发,越来越重视。
虽然使用JNI已经很久了,NDK也小范围的进行过实际项目的开发。但,自己的笔记中,这些方面的知识记得都比较零散。自己对这些知识从生疏到熟练,这个过程花费了很长时间。现在回顾一下,其实如果系统性的进行了梳理和着重强化练习,这个过程其实可以大幅缩短。想想还是认真梳理一下吧,知识先是越学越多,再是越学越少。
首先AndroidStudio工具需要配置NDK开发环境,我用的AndroidStudio 3.2 版本。过程非常简单,勾选以下红框的选项,联网进行自动下载,沿途一律同意!
当然,如果不进这些配置,直接创建JNI项目也是可以的,到时候会有多种报错。你只需要,根据报错提示,安装相应的工具或插件即可。但是,我还是建议进行预先配置,这是个习惯或做事思路的问题。古语有云:未雨绸缪 欲速则不达
以上图:
CMake 用于产生编译脚本CMakeLists.txt,其本身并没有真正参与代码编译。AndroidStudio中真正进行编译的是Glide工具中的插件nijia,这里我们不用关心;
LLDB 用于进行调试;
NDK 真正进行NDK开发的工具集;
使用AndroidStudio创建一个JNI项目
1、勾选 Include C++ support
2、其他步骤与创建普通Android项目相同。
由于步骤1,勾选了 Include C++ support,才会出现下图所示界面。
图①:C++ Standard: 选择C++库
Toolchain Default: 默认 CMake 设置
C++ 11:支持C++11特性
C++ 14:支持C++14特性
图②:Exceptions Support(-fexceptions):
如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 标志。
图③:Runtime Type Information Support(-frtti):
如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -frtti 标志。
经过以上设置,就可以创建一个JNI的Hello World项目。
下图为这个JNI项目的目录结构,和基本代码结构:
文件夹 main — cpp: 这里的cpp文件夹,在以前的AndroidStudio 和 Eclipse版本中,命名为JNI。估计Google觉得,cpp文件夹(原JNI文件)中书写的是C/C++代码,所以为了好理解不误会,就将其改名字了。
JNI主要包含3部分代码,分别对应图中的 ①、②、③。
①:将要使用的library库进行引用。所有代码第一步都是要引用或关联代码库,然后才能代用库中的方法或属性;
②:在Java代码中定义 native方法;
③:在C代码中,对应创建(JNI代码第一种书写方法)或映射关联(JNI代码的第二种书写方法),Java代码中的native方法。
完成以上三步,就可以在Java代码中调用这个native方法,以便让C代码中的函数参与运算或业务处理。
以上内容是JNI与NDK开发环境的搭建(随着工具的更新,这个很简单了,以前的还是有点复杂)。并且,介绍了一下JNI的目录与代码构成。下一篇预计讲解一下,JNI的语法使用和注意事项。希望到时候工作不忙!