NDK-JNI之初体验
Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。
众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了:
从C / C++生成原生代码库所需要的工具和build files。
将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
支持所有未来Android平台的一系列原生系统头文件和库
为何要用到NDK?
概括来说主要分为以下几种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
前面的只是介绍,我们来动手尝试一下。
一、 我是在Android Studio中开发的,建议还没有使用AS的小伙伴得抓紧时间学习一下AS的使用啦。首先,我们需要在官网下载NDK
二、 让我们开始体验之旅吧~
1、新建一个Project,声明需要的native方法,如下图所示:
声明完需要的native方法,然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录: TestNDK\app\build\intermediates\classes\debug。然后接下来的步骤就是根据生成的class文件,利用javah 生成对应的 .h头文件。
2、点开AS的Terminal标签,进入debug文件夹,截图如下:
3、然后使用javah命令生成h文件,操作如截图:
回车之后,如果没有任何错误这个时候会在debug文件下生成一个.h文件
这个文件就是AS帮我们生成的jni方法的声明头文件。
4、在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。 在jni目录下新建一个c文件,随意取名,我的叫JniTest.c。然后将.h文件中的方法拷贝到c文件中,在相应的方法中实现具体的操作。
5、接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样
另外,手动添加偶尔会把路劲填错,我们可以通过下面的方式来设置NDK路径
6、接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
在jni文件下面新建一个Android.mk文件
内容如下:
7、重新build一下project,这个时候会报一个错误,大致是这个意思:
Gradle sync failed: Error: NDK integration is deprecated in the currentplugin. Consider trying the newexperimental plugin. For details, seehttp://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true"in gradle.properties to continue using the current NDK integration.
Consult IDE log for moredetails (Help | Show Log)
要解决这个错误,我们需要在gradle.properties中作设置
重新build一下project,等编译完成之后会生成相应指令集的so文件,文件路径如下:
8、引用.so库,将lib拷贝到libs文件夹里面,然后在app module目录下的build.gradle中设置jniLibs源路径
9、在需要引用方法的地方导入库
10、运行结果如下图
到此为止NDK的基本使用就已经讲完了,具体的需求就需要小伙伴们具备一定的C程序开发能力啦~