NDK-JNI之初体验

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程序开发能力啦~

猜你喜欢

转载自blog.csdn.net/zhimingshangyan/article/details/52351956