郑重申明:如需转载本博客,请注明出处,谢谢!

这几天在学习android NDK的开发。那么首先让我们来看看android NDK开发的本质是什么。

NDK(Native Development Kit),即本地开发工具,简单地说。就是在开发android应用程序的时候,在java类中调用native函数,而native函数的接口也是在java类中定义的,可是native函数终于由本地的C/C++代码实现。简单地说,就是在java中调用C/C++函数。

至于为什么要用NDK,我总结了一下,大致有下面几方面原因:

1.提升程序执行效率:众所周知。在处理复杂运算或者对速度、内存要求苛刻的程序中,C/C++比java的效率要高出非常多,比方人脸识别、OCR字符识别等图像处理程序,用C/C++实现无疑是首选。

2.与硬件打交道:java之所以能跨平台,是由于全部的代码都是由JVM(java虚拟机)来解释的。这样就屏蔽了底层硬件体系结构的差异。

可是假设我们的程序须要与底层硬件打交道,或者与驱动程序交互,那么就要用C/C++来写代码了。

3.复用现有的程序:比方你有之前已经用C/C++实现了的程序,想移植到android平台上来,则能够直接通过NDK拿来用。不用再所有改写成java的。

如今就来说说android NDK开发的一般步骤吧。

一、准备工作:搭建android开发环境,包括jdk、ADT(新版的已经包括了eclipse IDE)、SDK等的下载安装,不会的自行百度,相关文章太多了,我在此不再赘述。

二、在官网上下载NDK,网址:http://developer.android.com/tools/sdk/ndk/index.html。依据自己的操作系统平台(windows32或windows64或Linux或Mac)下载对应版本号的NDK,然后双击解压到对应的目录。

三、新建一个普通的android应用程序(注意最小支持的API版本号要>=14)。假设是新手,不清楚这个,能够百度、谷歌。

四、在ADT开发环境中设置NDK的路径

点击Window菜单,选择Preference,点击Android展开后点击NDK,设置NDK路径,点击Apply,例如以下图所看到的:

五、加入Native Support

右键project。->Android Tools->Add Native Support。输入将要生成的.so文件的名字,点finish,例如以下图:

六、设置C/C++的Paths and Symbols

右键project,->Properties,点击C/C++ General展开,点击Path and Symbols,在右边Includes下。点击Add。把NDK目录下的jni头文件和对应的C++头文件加入进来。这一步很重要,否则会报错,详情请见我的还有一篇文章:http://blog.csdn.net/u013149325/article/details/40371873

七、在project源文件的包中加入一个类,用于定义native函数接口。例如以下图:

八、依据上一步中定义的接口,生成C/C++头文件

能够用javah命令生成头文件,详见我的还有一篇文章:http://blog.csdn.net/u013149325/article/details/40263413,我一開始也是在cmd窗体下用javah命令生成的,后来发现直接在ADT中配置相关选项,就能够生成头文件。

不得不说如今ADT太强大了。假设你的ADT不支持相关功能,能够下载最新版本号的。

在菜单条中点Run->External Tools->External Tools Configurations,右键Program->New,在右边的main子窗体配置例如以下图,Name能够自己随便取一个名字。

然后点Refresh。例如以下图勾选:

再点Common,勾选例如以下:

在菜单条button下点javah,就能够发如今jni目录以下生成了.h头文件,如右图

九、编写C/C++源文件,编译生成.so文件

.so文件事实上是Linux系统下的动态链接库,就相当于我们windows下的dll。而android系统是基于Linux的,所以会用到它。网上有非常多人建议用Cygwin来生成.so文件,本人亲自实验也成功了。可是能在ADT集成开发环境里面自己主动生成会更加方便。

编译project后,在jni目录以下会生成一个与project同名的.cpp文件。打开它,在这里面编写C++代码。

例如以下图:

这里面要包括上一步生成的.h头文件,然后在这里面实现native函数。假设不理解JNIEnv *、jclass、jintArry这些类型,能够深入学习JNI编程相关知识。假设你须要多个.h和.cpp文件。仅仅要把它们都放在jni目录下就能够了。

右键Project,Properties->Builders->New,新建立一个Builder。

在弹出的对话框上面点击Program,点击OK,在弹出的对话框【Edit
Configuration】中,配置选项卡【Main】,Location中须要填入nkd-build.cmd的路径(NDK安装文件夹下)。WorkingDiretcoty中填入project根文件夹。例如以下图:

配置选项卡【Refresh】:勾选“Refresh resources upon completion”,勾选“The entire workspace”。勾选“Recuresively include sub-folders”,例如以下图:

配置选项卡【Build Options】: 勾选“After a “Clean””。 勾选“During manual builds”,勾选“During auto builds”,勾选“Specify working set of relevant resources”。例如以下图:

在上图中,点击“Specify Resources…”勾选Testproject的“jni“文件夹。点Finish。再点OK保存。例如以下图:

在project的jni目录以下新建一个Makefile类型的文件,文件名称为Application。

(注:假设你不知道怎么新建Makefile类型的文件,能够把jni目录下的Android.mk文件在原地复制一份。然后重命名为Application。打开Application.mk之后改动里面的内容就可以)。

例如以下图:

编辑Application.mk文件,依据你的模拟器处理器类型和SDK级别添加例如以下两行。当中APP_ABI 指定处理器类型。能够指定多个。

APP_ABI := armeabi-v7a

     APP_PLATFORM := android-19

因为我们勾选了“During auto builds”,所以在project有所改变的时候,so文件便会自己主动编译。正确生成以后就能在project文件夹下发现多了一个libs文件夹,例如以下图:

好了,android NDK程序的环境搭建配置、编译的具体流程到这里就结束了。我正在尝试android NDK中在C/C++源码中设置断点跟进去调试,等我调试成功了就再写博客与大家分享。

windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)的更多相关文章

  1. Windows下搭建Android NDK开发环境及命令行编译

    首先说明本文内的相关安装操作参考<Pro Android C++ with the NDK>一书. 安装 Windows搭建Android NDK开发环境需要安装如下部分(同时需要配置对应 ...

  2. android NDK开发环境搭建

    android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...

  3. 简单的调用OpenCV库的Android NDK开发 工具Android Studio

    前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈    本文后续也许还会有删改, 就 ...

  4. 跟我学Android NDK开发(一)

    Android NDK 开发跟其它开发一样,首先需要配置好开发环境,本文以 Ubuntu系统为例介绍如何进行 Android NDK 开发环境的配置. 1. 简介 什么是 Android NDK 呢? ...

  5. Android NDK开发

    Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...

  6. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  7. Android NDK 开发(二) -- 从Hlello World学起【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719  上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...

  8. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  9. android NDK开发在本地C/C++源码中设置断点单步调试具体教程

    近期在学android NDK开发,折腾了一天,最终可以成功在ADT中设置断点单步调试本地C/C++源码了.网上关于这方面的资料太少了,并且大都不全,并且调试过程中会出现各种各样的问题,真是非常磨人. ...

随机推荐

  1. HDU-4296 Buildings 贪心 从相邻元素的相对位置开始考虑

    题目链接:https://cn.vjudge.net/problem/HDU-4296 题意 有很多板子,每一个板子有重量(w)和承重(s)能力 现规定一块板子的PDV值为其上所有板子的重量和减去这个 ...

  2. shell学习日志

    0.shell的变量同环境变量不同,存在用户环境区. 变量赋值的方式是: variable_name = variable_value a= "hello" $a对a进行取值 关于 ...

  3. Bedrock Linux 0.7.3 发布

    Bedrock Linux是一种元分发,允许用户利用其他通常互斥的Linux发行版的功能,并让它们无缝地一起工作.该项目发布了其0.7.x系列,Bedrock Linux 0.7.3的更新. 新的更新 ...

  4. 使用 vue + thinkjs 开发博客程序记录

    一入冬懒癌发作,给自己找点事干.之前博客程序写过几次,php 的写过两次,nodejs 用 ThinkJS 写过,随着 ThinkJS 版本从1.x 升级到 2.x 之前的博客程序也做过升级.但是因为 ...

  5. 紫书 例题8-10 UVa 714 (二分答案)

    这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...

  6. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  7. 题解 洛谷 P4047 【[JSOI2010]部落划分】

    我觉得几乎就是一道最小生成树模板啊... 题解里许多大佬都说选第n-k+1条边,可我觉得要这么讲比较容易理解 (虚边为能选的边,实边为最小生成树) 令n=5,k=2,(1,3)<(1,2)< ...

  8. hadoop-09-安装资源上传

    hadoop-09-安装资源上传 在/software/www/html 下面上传 ambari  HDP  HDP-UTILS-1.1.0.21 文件,之后解压:

  9. Innosetup

    卸载的同时删除日志,卸载的时候判断程序是否正在运行,regsvr32 1.卸载程序的时候如何判断程序是否正在运行 http://bbs.csdn.net/topics/370097914 2.强制删除 ...

  10. CSRF的原理

    CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...