介绍一下NDK的使用
Hello 大家好 又来到了我们最喜欢的学习时间了 今天学习了一下NDK
俗话说好记性不如烂笔头 所以我就把学习到的知识总结一下:
虽然我对NDK的了解不太充足 日后肯定要慢慢提升自己的知识 今天先来小结一下:
NDK:
在此之前建议先去了解一下JNI:一篇简单的JNI的介绍
定义:Native Development Kit 是Android一个开发工具包
NDK 是属于Android的 , 与java并无直接关系
作用:作用:快速开发c、c++的动态库,并自动将so和应用一起打包成APK
即可通过NDK在android中,使用JNI与本地代码(如c、c++)交互
应用场景:在Android的场景下使用JNI即Android开发的功能需要本地代码(c\c++)实现
特点:
这里注意:
使用步骤
1、配置Android NDK环境
2、创建Android项目,并与NDK进行关联
3、在Android项目中声明所需要调用的Native方法
4、使用Android需要交互的本地代码,实现在Android中声明的Native方法
比如Android需要与C++交互,那么就用C++实现Java的Native方法。
5、通过ndk-build命令编译产生.so库文件
6、编译Android Studio工程,从而实现Android 调用本地代码
NDK与JNI关系
下面介绍一下NDK的具体使用方式:
介绍两种在Android studio中实现NDK的方法:
android Studio2.2以下&2.2以上
Android Studio2.2以下实现NDK
步骤如下
1、配置Android NDK
2、关联Android Studio项目与NDK
3、创建本地代码文件(即需要在Android项目中调用的本地代码文件)
4、创建Android.mk文件&Application.mk文件
附:我们需要配置好我们的NDK才可以进行操作 这里我是直接下载的NDK 以及自动绑定的Studio 我们也可以通过其他方式下载NDK进行绑定 (建议是通过studio下载)
像上面这个样子也就是我们的NDk绑定成功了 下面继续介绍NDK的操作
Android studio3.0上NDK编程:
我们需要Android Studio 特别厉害的插件功能
首先选择到我们的Setting 通过目录来找到我们的核心点External Tools
在这里面我们就可以配置我们的两个插件:
这里我的studio的版本是3.4.1 版本不一致 我们的样式也不样 但是具体的操作还是一样的
第一个 javah -jni命令:
根据java文件生成.h头文件,会自动根据java文件中的类名(包含包名)与方法名生成对应的C/C++里面的方法名。
下面是参数配置及其含义:
1、Program:$JDKPath$\bin\javah\java.exe这里配置的是JDK目录下的javah.exe的路径。
2、Arguments:-classpath $ModuleFileDir$\src\main\java -jni -d $ModuleFileDir$\src\main\jni $FileClass$ 这里$FileClass$指的是要执行操作的类名(类的全名(包名+类名))(即我们操作的文件),$ModuleFileDir$/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
3、Working directory:$ModuleFileDir$\src\main\java表示module目录下的src\main\java目录。
使用方式:选中java文件->右键->External Tools->javah -jni,将生成jni文件夹以及文件夹下的包名.类名的.h头文件(名字有点长,可以自己重命名)。
第二个 ndk -build命令:ndk -build命令,是根据C/C++文件生成so文件的。
1、Program:F:\SDK\SDK\ndk-bundle\ndk-build.cmd这里配置的是ndk下的ndk-build.cmd的路径(根据实际情况填写)
2、Working directory:$ModuleFileDir$\src\main\
使用方法:选中C/C++文件->右键->External Tools->ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。
接下来我们通过简单的操作来完成对NDK的操作
首先我们定义这样一个方法:
接下来我们右键选中我们刚才设置的两个插件 中的javah - jni
完成上面这一步操作以后我们就发现我们的mian方法下多了一个jni的文件夹 这个文件夹中放着我们对应的.h文件
以及文件中有一个返回值为String的方法 :
创建c或c++文件 :把这个.h文件复制一份到这个文件夹下把后缀改为.c 用来声明.h文件中的方法
修改后的代码如下:
至此,.h文件和c++文件已完成,想生成so文件还需要在这个jni目录下增加两个文件,Android.mk和Application.mk。
如果大家对这两个mk文件不了解的话进行可以了解一下:认识Android.mk和Application.mk
Android.mk 文件:
Application.mk 文件:
接下来:
通过我们定义的第二个插件 ndk-build 我们发现我们又多了两个文件夹 看到这个libs文件夹是不是特别的属性 我们集成三方下来的SDK不都是这个样子的吗
点开以后就是我们要使用的so文件
我们把这个lib文件夹下的所有内容复制到我们app下的lib文件夹 然后生成的三个文件夹都删除掉
接下来我们就要在我们的budild.gragle中使用我们的lib资源了
然后我们就可以调用资源来使用啦:
这时我们就完成了我们所需要的操作了 我们就可以调用上面所写的getString()这个方法进行调用啦
是不是觉得很简单呢?^.^
如果发现那些做的不好的可以提交给我哦~