NDK-JNI之初体验

原创 2016年08月29日 12:30:34

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android NDK开发(一)JNI初体验

JNI(Java Native Interface) 中文名:Java本地接口,Android中与C交互的一种技术。本文章是基于Android Studio ,所以Eclipse的小伙伴们 sor...

Android Studio之NDK,JNI开发初体验

概述JNI(JavaNative Interface)是由Java语言提供的供Java和C/C++相互通信的机制,就是Java与C/C++的互调 NDK(Native Development Kit...
  • wbwjx
  • wbwjx
  • 2016-10-02 23:49
  • 366

Linux脚本编程之初体验

  • 2013-07-17 09:30
  • 118KB
  • 下载

新手写网络爬虫之初体验

根据上级安排,需要抓取某个网站的数据,用到了网络爬虫相关的知识,于是就去找了许多相关的资料和例子看。网上的例子很多,但都基本是对一些静态页面进行数据抓取。涉及到了模拟登录相关的例子则很少,即使有讲解的...

ExtJS4之初体验

  • 2012-06-08 20:09
  • 70KB
  • 下载

ubuntu 16.04之初体验(多图)

ubuntu 16.04之初体验。

SBC2410之初体验_SBC2410

  • 2008-11-21 16:22
  • 454KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)