一、什么是NDK?
1、定义
交叉编译:在一个平台上编译出另外一个平台可以运行的二进制代码。比如说在虚拟机的linux平台上利用交叉编译工具链编译出在arm跑的代码。那什么是交叉编译工具链?
交叉编译工具链:一大堆工具放在一起,链式调用(一个调用另一个)形成的工具链。个人理解拆成两大部分理解:交叉编译工具 链,也就是把交叉编译工具链在一起
NDK:native develop kits 本地开发工具集(也就是交叉编译工具链)
2、NDK目录结构
既然NDK是个交叉编译工具链,那么它应该是个软件包之类的:
解压得到
3、配置三步:
第一,解压后环境变量Path加上NDK的路径
第二, local.properties加上NDK的路径,如
ndk.dir=E\:\\Sofeware_Setup\\NDK\\android-ndk-r15c
第三,gradle.properties加上android.useDeprecatedNdk=true
二、什么是JNI?
定义:Java Native Interface java本地接口
硬件抽象层HAL的接口用的是c++,framework层用的是java,所以framework想调用HAL的接口需要借助JNI,相当于一种桥梁,一种通信协议,一个翻译官
三、NDK和JNI有什么关系?
我们在Eclipse或者Android Studio开发好JNI相关接口的时候需要用到NDK工具进行编译生成相关的so库文件
四、JNI 中java调用c
第一步:在java类里面写native代码(可以新建一个类专门放native代码或者在一个已有的类里面直接写也可以)
第二步:在main的目录下新建文件夹jni,然后在里面写c代码,c代码记得包含头文件jni.h
第三步:在c文件目录下添加Android.mk文件
第四步:编译c文件生成so文件
第五步,导入so库文件,开始使用
补充:
1、第二步中函数头除了自己手写之外还可以通过javah来获取
2、如果不是通过编写Android.mk文件,然后通过ndk-build来编译c文件,而是用Android Studio的build 来编译会报错的话,会报错如下:
解决办法:使用CMake和LLDB
五、JNI 中c调用java
待后续补充