Android-NDK/JNIJNI和【NDK】

介绍一下NDK的使用

2019-05-27  本文已影响95人  LiChengZe_Blog

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()这个方法进行调用啦

是不是觉得很简单呢?^.^ 

如果发现那些做的不好的可以提交给我哦~

上一篇 下一篇

猜你喜欢

热点阅读