【vfp开源代码栏目提醒】:网学会员vfp开源代码为您提供AndroidNDK开发环境实现与应用 - 企业软件开发参考,解决您在AndroidNDK开发环境实现与应用 - 企业软件开发学习中工作中的难题,参考学习。
ComputerKnowledgeandTechnology电脑知识与技术软件设计开发本栏目责任编辑谢媛媛第6卷第35期2010年12月AndroiNDK开发环境实现与应用赵宏伟信息网络安全公安部重点实验室上海201204摘要AndroiNDK推出以来其Winows平台下环境搭建过程与应用的官方指导手册一直比较简略其中NDKCygwin的搭建方式是目前Winows平台下比较主流的组合。
文章对NDK、ygwin等在在开发环境搭建过程中的一些注意事项和细节进行了详细的描述可以帮助从事nroiNDK开发的程序设计人员快速高效的完成平台搭建和调试工作。
关键词AnroiNDKygwinADB原生开发包中图分类号TP311文献标识码A文章编号1009-3044201035-10055-03AndroidNDKPlatformBuildandApplicationZHOHong-weiKeyLaboratoryofMinistryofPublicSecurityInformationNetworkSecurityShanghai201204hinaAbstract:SincethelaunchofnroiKtheofficialguieofitsbuilingprocessanapplicationunerWinowsplatformhasbeenrelativelybriefwhichmeansthebuilingwaysofNKygwinisacombinationofmoremainstreamunerWinowsplatform.rti-clegivesathoroughlyescriptionofsomenotesanetailsinthecourseofexploitingenvironmentthatcanhelptheprogrammersoftheevelopmentofnroiNDKtoothejobofbuilinganebuggingmoreefficient.Keywords:nroiNDKygwinDnativeeveloperkitAndroid系统在手机和平板电脑领域的一个很大的优势在于开放性和服务免费性面向第三方平台完全开放开发者可以获得最大的自由度Android系统从Linux中来更是给广大从事Linux开发的程序员带来了很好的机遇。
Android的NDK是一个能够更好的发挥手机软硬件平台性能的开发包。
对NDK的学习和使用将能够更好的提高应用程序的运行效率获得更好的用户体验。
1Android、NDK、Cygwin简介Android是Google公司推出的一个基于Linux的
开源手机操作系统。
在Android未推出之前手机操作系统领域主要上被Symbian、WindowsMobile、iPhone、黑莓等几大系统瓜分市场波澜不惊。
Google的Android系统推出后掀起一片狂潮众多手机厂商纷纷退出自己的Android机器。
随着Android手机的不断增多Android系统应用开发也随之火热起来众多软件公司和开发人员纷纷加入。
Google的AndroidNDK是Android原生态开发工具全称是NativeDeveloperKit主要面向C、C程序员NDK可以将本地C、C组件
代码嵌入到应用程序中使用。
在SDK模式下Android应用程序是运行在Dalvik虚拟机中的。
NDK能够让你的应用程序直接使用原生态开发语言C、C来开发。
这样就大大提高了对现有
代码的重用性加快了开发进度。
由于Google规定Android系统对直接运行原生应用程序有诸多限制同时NDK也将无法访问AndroidFrameworkAPI所以我们一般使用NDK开发一些核心的需要高效执行的
代码组建.so文件来让Java通过JNI方式调用最终执行在Dalvik虚拟机中。
NDK组件最终还是需要通过APK包的形式发布并安装到Android系统中使用。
NDK提供功能如下将C、C
代码编译成本地运行的库的工具和编译环境。
2将本地运行库嵌入到应用程序包apk的工具。
3支持android15及后继版本开发的支持库lib和头文件h。
4相关的应用文档、
代码示例和教程。
NDK最后发行版包含了对最新ARM指令集的支持1ARMv5TE支持Thumb-指令集2ARMv7-A支持Thumb-2和VFPv3-D6指令集部分支持NEON/VFPv3-D32指令集3X86指令集Cygwin是一套可以运行在Windows平台上的UNIX/Linux模拟器。
运行Cygwin后你可以得到一个类似WindowsCMD的Shell环境界面可以使用大部分Linux软件和功能。
使用它我们可以方便的在Windows平台编译出Linux平台的库文件或应用程序。
对于学习UNIX/Linux操作系统环境应用程序移植或者进行特殊开发工作尤其是目前比较流行的嵌入式系统开发非常有用。
Cygwin包含一套在Windows系统下实现POSIX系统调用的API还有一套GUN开发工具GCC、GDB可以方便的在Windows下进行各种跨平台的软件开发工作。
收稿日期20101026作者简介赵宏伟1982男安徽合肥人计算机软件工程。
E-mail:xsjlccccnetcnhttp://wwwdnzsnetcnTel:86-551-56909635690964ISSN1009-3044CoputerKnowledgeandTechnology电脑知识与技术Vol6No35December2pp55-5710055ComputerKnowledgeandTechnology电脑知识与技术本栏目责任编辑谢媛媛软件设计开发第6卷第35期2010年12月2NDK开发环境配置.1NDK的安装NDK的下载见官网http://developer.android.com/sdk/ndk/index.html如果打不开可能是被防火墙屏蔽了可以在百度搜国内的。
官网有三个版本分别是Windows、MacOSXintel、Linux32/64x86下载后解压即可使用。
文中将使用NK和Cygwin组合的开发环境所以我们选择了Windows开发包下载。
以NK2.2为例解压缩到如下目录图1。
.Cygwin的安装Cygwin的安装也是相当简单的首先去Cygwin官网下载网络安装程序官网http://www.cygwin.com下载下来以后点击直接运行。
这里用网络安装方法来简单说明下。
然后选择InstallfromInternet从网络安装如果你是内网可以自己从官网下载好各种需要安装的包然后选InstallfromLocalirectory来从本地文件夹安装。
下一步后选Cygwin的根目录如E:cygwin其他默认继续下一步是配置Cygwin从网络下载的安装包文件存放位置可以随便选个。
然后继续配置上网方式根据自己的实际情况配置我们选DirectConnection直连方式。
后面是选择下载源可以选国内的源速度相对快些。
再下一步就是关键配置了这里是选择需要安装的包。
我们需要如果只需要支持AndroidNK的开发那么只需要选择安装gcc、make两个即可图2选中后Cygwin会自动选择这两个的相关支持。
否则将无法编译我们的AndroidNK
代码。
这部分配置完成后Cygwin安装程序将会从你选择的源自动将各种包下载好并安装。
安装完成后我们的工作就完成里一大半了。
下面开始将我们的AndroidNK配置到Cygwin中。
Cygwin安装后会自动创建一个用户当前用户用户名为自己当前登录Windows的用户名。
我们打开Cygwin安装目录在X:cygwinhome目录下会看到一个.bash_profile文件图3。
打开后在最下面加入NK路径:NK/cygdrive/d/android/android-ndk-r4bexportNKNK是导出名可以任意命名等号后面是Cygwin下的路径我的NK放在:androidandroid-ndk-r4b那么对应的cygwin目录就是/cyg-win/d/android/android-ndk-r4b然后通过export导出图4。
我们打开Cygwin输入CNK如果能进入AndroidNK目录那么我们配置已经成功完成了图5。
我们已经可以用Cygwin来编译我们的N
代码了。
3NDK使用3.NK工程路径设置AndroidN源码路径设置遵循一定的路径格式。
工程文件夹下需要包含如下几个目录JN、Libs、Obj图6。
NI目录用来存放需要编译的源码文件。
Libs是编译后的库文件编译脚本会自动拷贝到这个文件夹下。
Obj文件夹是编译器编译源码时产生的目标
代码存放位置另外如果链接的时候需要的库文件那么库文件也可以放在这个文件夹下面。
Android编译的时候编译脚本会自动寻找JNI目录下的Android.mk文件。
然后根据脚本配置开始编译工作。
所以我们的N工程里面至少要包含一个JNI文件夹并且文件夹下有一个Android.mk后面两个文件夹编译器编译的时候会自动创建。
3.NK编译脚本说明N的编译依靠Android.mk文件中的配置典型的Android.mk文件如下LOCAL_PATH:callmy-dirincludeCLEAR_VARSLOCAL_MOULE:MyAppLOCAL_SRC_FILES:MyApp.cincludeBUIL_SHARE_LIBRARYLOCAL_PATH:callmy-dir这句用来指定编译的路径。
通过调用宏my-dir获取到当前工作的路径。
图1图2图3图6图4图510056ComputerKnowledgeandTechnology电脑知识与技术软件设计开发本栏目责任编辑谢媛媛第6卷第35期2010年12月includeCLEAR_VARSCLEAR_VARS这个变量是编译系统提供的用来指明一个GNUmakefile文件添加这句主要的目的是清理所有的LOCAL_XXX比如LOCAL_MODULELOCAL_SRC_FILES。
在每个新模块的开始处需要添加这句。
LOCAL_MODULE:MyApp这句定义了模块名称将来编译的库或者可执行程序就以此命名。
若果编译的是动态库或者静态库那么库名就是libMyApp.so或者libMyApp.a。
需要注意的是系统系统会在生成动态库或者静态库的时候自动添加lib的前缀了。
LOCAL_SRC_FILES:MyApp.c是列出需要编译的源码文件名头文件.h不需要指定系统会自动搜索如果有多个源文件可以用空格隔开也可以另起一行但需要在上一行加上空格换行符来告诉编译器includeBUILD_SHARED_LIBRARY这句说明将来生产的库是共享库及动态链接库若需要生产静态库可以这样写BUILD_STATIC_LIBRARY若要产生可执行程序则为BUILD_EXECUTABLE可执行程序一般用来调试库文件方便Google不建议直接用NDK做Android下的可执行程序还有一些常用的编译变量描述如下LOCAL_CPP_EXTENSION描述C文件后缀名默认是CPP如果是其他的如CXX等后缀名就需要对修改这个变量好让编译器识别LOCAL_LDLIBS用来定义连接目标文件时需要用到的模块可以使用“-l”前缀来指定库名字如LOCAL_LDLIBS:-lld。
这个变量一般用来指定系统库且库名前面的lib省略如-llog指定的就是liblog库。
LOCAL_STATIC_LIBRARIES此变量用来指定包含哪些静态库到您的工程中。
同样可以包含多个多个库之间用空格隔开。
LOCAL_SHARED_LIBRARIES这个变量跟上面类似不同的是他是用来指定动态库的。
3.3ADB命令说明Android的adb命令是我们直接操作和管理Android手机的必备工具adb工具在AndroidSDK中在此我们就不多作说明adb的全称为AndroidDebugBridge就是调试桥。
使用adb可以对手机或者模拟器进行安装程序、系统升级、运行shell等等操作。
在开发Android程序之前我们必须深入的了解他才能更好的为我们服务下面解释下我们开发过程中常用到的几个命令。
adbdevices查看当前连接的设备连接到计算机的android设备或者模拟器将会列出显示。
adbinstall:将指定的apk文件安装到设备上。
adbuninstall-k卸载文件如果加-k参数为卸载软件但是保留配置和缓存文件。
adbshellcommand通过上面的命令就可以进入设备或模拟器的shell环境中在这个LinuxShell中你可以执行各种Linux的命令另外如果只想执行一条shell命令可以采用以下的方式如adbshelldmesg会打印出内核的调试信息。
adbpush把本机电脑上的文件或者文件夹复制到设备手机。
adbpull把设备手机上的文件或者文件夹复制到本机电脑。
3.4NDK工程编译和执行在NKD目录下建立一个工程文件夹命名为hello然后在hello里面建立一个子文件夹jni在jni里面创建一个hello.cpp文件图7。
Hello.cpp文件内容如下:includestdio.hclassCHellopublic:CHelloprintfHelloAndroidnintmainintargccharargvCHelloHelloreturn0这里为了演示方便我们直接编译一个可执行程序在android的控制台中运行运行结果是在控制台中打印出HelloAndroid这句话。
再在JNI文件夹中建立android.mk脚本文件图7内容如下LOCAL_PATH:callmy-dirincludeCLEAR_VARSLOCAL_MODULE:helloLOCAL_SRC_FILES:hello.cppincludeBUILD_EXECUTABLE然后打开Cygwin进入能打开目录编译刚刚建立的演示工程开始编译图8如果
代码没有任何错误那么编译成功后会自动拷贝刚刚编译好的文件到hello/libs/armeabi文件夹下。
将刚刚编译好的hello文件上传到Android手机或者模拟器中。
Android默认是不能在存储卡中执行的。
所以我们将hello文件上传到系统根目录的data文件夹下图9。
下转第10060页图8图710057ComputerKnowledgeandTechnology电脑知识与技术本栏目责任编辑谢媛媛软件设计开发第6卷第35期2010年12月上接第10057页使用adbshell建立android连接这样的执行环境类似于Windows里面的管道
代码在Android系统中执行结果将会反馈到我们的shell中。
上一步上传进来的hello文件属性需要设置成可执行文件才能在Android系统中执行设置方法跟其他Linux系统完全一样使用chmod命令。
设置好后./hello执行即可图105一些细节在非模拟器环境如果要直接上传到非存储卡目录是没有权限的我们需要先获得root权限但是我们就算获得root权限也无法直接上传文件因为这些文件夹是只读的我们需要将要上传的文件夹重新挂载为可读写的。
命令如mount-orwremount-tyffs2devlockmtdblock3dtC中的类中调用so库的导出函数的时候直接调用会出现链接错误这个时候需要另外做一个纯文件作为一个桥梁在头文件中定义文件的里面的转换函数再在实现文件中调用so库中的接口如so库中有个导出函数intddintintb我们在头文件中定义一个intmyddintint然后在mydd中实现对dd函数的调用将参数传过去才可以顺利通过调用参考文献1ndroidDevelopersEBOhttp:developer.android.comsdkndkindex.html.2杨丰盛.ndroid应用开发揭秘M.北京:机械工业出版社2010:484.3ndroidSDKDocumentEOhttp:developerndroidcomguideindexhtml图10图94保存网站文件并在浏览器中查看图24结束语本文所用的实例将部分
代码封装到单独文件中的方法使
代码的维护性尽可能高1用户控件用于站点的大量页面上重复使用的部分.spx文件2后台编码用于在一个文件中包含页面中所有的脚本
代码这两个方法都是将
代码移到不同的区域以提高可读性降低复杂性避免将显示
代码和脚本放在一起所引起的错误虽然用户控件可以帮助我们解决大量
代码重复的问题但是它也受到一定的制约最后我们来分析一下用户控件的优缺点适用于1页面上的重复元素比如说标题、菜单、登录控件等2将重复元素封装到用户控件中减少每页的
代码量不适用于1从
代码块中分离出表示性的HTM2封装可重用软件包中的业务逻辑3创建一个重用范围比较大的控件不只是用于应用程序中参考文献1NagelEvjenGlynnJC高级编程M.6版.北京:清华大学出版社2008:1179-1185.2UllmnCGoodeC.SPNET入门经典M北京:清华大学出版社2002:501-5233李春生罗晓沛基于NET实现分布式数据库查询J计算机工程与设计20072812:2937-2939.图2实验结果10060