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

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

关于NDK和jni你究竟了解多少?

http://blog.csdn.net/banketree/article/details/12167145首先我们要知道Java是如何调用c/c++的什么是JNIjava native inter...

Android开发学习之路--NDK、JNI之初体验

好久没有更新博客了,最近一直在看一个仿微信项目,然后看源码并自己实现下,相信经过这个项目可以让自己了解一个项目中的代码以及种种需要注意的事项。不知不觉中博客已经快要40w访问量,而且排名也即将突破30...

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
  • 405

Linux脚本编程之初体验

  • 2013年07月17日 09:30
  • 118KB
  • 下载

Web基础——WebApp之初体验(三)

  • 2016年09月26日 14:58
  • 656KB
  • 下载

Vue-router之初体验(持续更新)

之前在做网站时页面与页面之间的转换都是使用a链接跳页面的方式进行跳转的,这样就会带来一个问题,那就是响应时间会变慢并且会时常出现卡顿的现象,这就让人很不舒服了。因此我开始在关注上Vue全家桶之一的vu...

嵌入式Linux系统之初体验

  • 2007年03月02日 20:54
  • 17KB
  • 下载

ExtJS4之初体验

  • 2012年06月08日 20:09
  • 70KB
  • 下载

机房收费系统合作版之初体验

随着机房收费系统重构版渐渐走进了尾声,我们的机房收费系统合作版也开始紧锣密鼓的进行了。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NDK-JNI之初体验
举报原因:
原因补充:

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