您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 【Win7下Android native code的编译和调试】
呼叫中心专家【Win7下Androidnativecode的编译和调试】光为这编译及调试环境就前后折腾了两三天,墙外找了很多教程,bill以为以下教程最为贴切Usingeclipseforandroid-ccDevelopmentUsingeclipseforandroid-ccDubugging自己跟着教程一步一步做下去,期间也不乏出现懊恼的问题,虽煞费周折,但最终还是尝到了编译调试nativecode的甜头。故模仿前文,以step-by-step方式记之,以备后用。----------------------------cutline-------------------------------Step-0环境准备开发及编译环境的下载和安装工作,网上已连篇累牍,恕我不再赘述。以下仅列出本次教程所用到的环境及版本,用以核对。1)普通的android开发环境(打算调试nativecode的朋友应该都已经具备这环境,我自己使用的是Eclipsejuno+ADT-ver:21.0.1+AndroidSDK+JDK6),本文使用的eclipse经过了汉化,bill已经将links汉化包上传,有需要的朋友可自行下载。2)Cygwin1.7.xCygwin的安装需要注意开发包的下载,其默认为Default,我们需要自行选择必要的开发工具包,展开Devel节点依次选择如下工具包后,点击下一步完成安装。呼叫中心专家)android-ndk-r8d4)EclipsejunoCDT插件-ver8.1.1Step-1新建AndroidDemo工程新建一个android工程NativeDebugDemo,使用androidapi9(bill只在api-9和api-14上调试过,其它版本尚未涉足)。运行以确定基本的android环境能够正常工作。呼叫中心专家中右击本项目名,新建文件夹,命名为jni(大小写敏感),在jni文件夹中新建文件,命名为Android.mk(大小写敏感),继续在jni目录下新建文件,命名为demo.c在src目录下新建包com.nativetools,并新建类NativeDemo(这个类仅仅为了将nativecode的声明与普通android代码声明分离,以为下一篇文章中提到的代码复用做准备)。编写类代码如下,对即将编写的nativecode进行声明(提示的警告可忽略):1.packagecom.nativetools;2.3.publicclassNativeDemo{4.static{5.System.loadLibrary(DemoModule);//加载nativecode的动态库libDemoModule.so,稍后解释6.}7.8.publicnativeintmax(inta,intb);//声明函数max为nativecode,具体写法请参照OracleJNIdoc9.}接下来需要编写我们的本地代码及Android.mk文件,在demo.c中编写用于本次Demo呼叫中心专家代码如下,注意本地函数的命名结构:Java_com_nativetools_NativeDemo_max必须以“Java_”开头,中间加上android中声明该函数的类的限定名,此处就是之前的com.nativetools.NativeDemo(点号全部替换成下划线,大小写敏感),最后才是该函数的名称“max”(关于本地代码的函数命名及相关规范请参照OracleJNIdoc):demo.c1.#includejni.h2.3.JNIEXPORTjintJNICALL4.Java_com_nativetools_NativeDemo_max(JNIEnv*env,jobjectjthis,jinta,jintb){5.returnab?a:b;6.}接着,我们需要向android-ndk描述我们的本地代码,编写Android.mk如下Android.mk1.LOCAL_PATH:=$(callmy-dir)2.3.include$(CLEAR_VARS)4.5.LOCAL_MODULE:=DemoModule6.LOCAL_SRC_FILES:=demo.c7.8.include$(BUILD_SHARED_LIBRARY)关于Android.mk文件的写法请参照本地文档/android-ndk-r8d/doc/ANDROID-MK.htlm呼叫中心专家代码准备工作就绪,接下来需要配置Eclipse以完成本次Demo的编译工作。首先,为了在Eclipse中编译本地代码,需要将当前android项目转换成android+C/C++混合项目。右击本项目名,新建→其它,选择“ConverttoC/C++Project(AddsC/C++Nature)”在接下来的对话框中选中本项目(默认已经选中),选择“ConverttoCProject”,在“Projecttype:”框中选择“Makefileproject”,在右边“Toolchains”中选择“--OtherToolchain”,点击“完成”,弹出对话框询问是否打开C/C++透视图,选择“是”即可。呼叫中心专家源文件,可以看到CDT已经起了作用,demo.c中出现了很多无法识别呼叫中心专家的类型,接下来就需要进行C/C++相关的配置,引入必要的include路径以解决这些问题。右击项目名,选择“属性”,在弹出的属性设置框中选择“C/C++Build”,在右边“BuilderSettings”中取消“UseDefaultbuildcommand”,并修改“Buildcommand”路径为你本机ndk-build.cmd程序的路径,以bill自己的为例:“E:\Android_SDK\android-ndk-r8d\ndk-build.cmd”,点击”应用“。切换到”Behaviour“选项卡,将”Build(Incrementalbuild)“栏的”all“命令删除,点击”应用“。呼叫中心专家接着在左边边侧栏选择”C/C++General“→”PathsandSymbols“,在右边的”Includes“一栏选择”GNUC“,点击”Add“。点击”Filesystem...“,选择androidndk对应平台(本项目是androidapi-9)的include路径(里面除了arch-arm以外还有两个平台,这里不用,详情请参考android-ndkdoc),以bill本机为例:”E:\Android_SDK\android-ndk-r8d\platforms\android-9\arch-arm\usr\include“,点击”确定“,确定并关闭设置对话框。回到demo.c,可以看到刚才无法识别的类型已经全部能够被CDT识别。右击项目名,点击”构建项目“,到此完成android+本地C/C++的编译过程。呼叫中心专家可以看到,编译成功后,在项目/libs/armeabi/目录下生成了动态链接库”libDemoModule.so“,名称”DemoModule“是bill在Androd.mk中指定的(前缀”lib“以及后缀”.so“是ndk-build自行添加的,如果你在Android.mk中将模型名写成”libDemoModule“,那么ndk-build将不会再添加前缀”lib“,详情请参见android-ndkdoc)而在类NativeDemo中加载的库正是”DemoModule“。Step-3在android中调用nativecode前面已经完成了nativecode的编译工作,接下来我们需要在android中调用nativecode以验证其正确与否。为简单起见,bill直接在MainActivity的onCreate方法中进行试验。修改onCreate方法如下:1....2.importcom.nativetools.NativeDemo;3.4.publicclassMainActivityextendsActivity{5.6.@Override7.protectedvoidonCreate(BundlesavedInstanceState){8.super.onCreate(savedInstanceState);9.setContentView(R.layout.activity_main);10.11.NativeDemonativetools=newNativeDemo();12.IntegermaxNum=nativetools.max(0,1);//调用本地函数max呼叫中心专家(this).setMessage(maxNum.toString()).show();14.}15....完成后运行程序,可以看到弹出窗口中显示数字”1“,我们的nativecode已经成功运行。Step-4nativecode的调试作为一个开发人员,bill认为调试所占用的时间远远超过了单纯的开发用时。如本文所述,我们在Step-3“开发”了一个调用nativecode的android试验程序,但只要是程序就有bug,调试是必不可少的阶段,下面bill就怎么在eclipse上对nativecode进行调试加以阐释,仿照前人的做法,分两个部分展开。一者,用eclipse调试java代码,并结合ndk-gdb以命令行的方式调试nativecode。一者,将二者合二为一,统一使用eclipse进行图形化调试(这种方法使得调试变得直观,呼叫中心专家但性能很糟糕)。Step-4-1eclipse+ndk-gdb调试nativecode首先我们需要将本项目设置为”可调试“。打开”AndroidManifest.xml“,设置”Debuggable“为”true“。然后在eclipse中给java代码打好断点,为简单起见,bill把断点打在nativecode:max的入口处,启动本项目的调试,待步进指示器停止在断点处。打开Cygwin终端,cd进入本项目的根目录,执行android-ndk-r8d根目录下的ndk-gdb脚本,为了查看启动过程,加入verbose选项,即输入命令”$ndk/ndk-gdb--verbose“(此处的”$ndk“是系统环境变量,指向android-ndk-r8d的根目录,请自行配置),启动如下:呼叫中心专家,警告有48个lib未能找到,其中包括”libstdc++.so“等,NDK官方文档里告诉大家:请直接忽略本警告~(bill当时花了大力气想解决这个问题,无果,直到参看NDKdoc......)到这里就是大家所熟悉的”(gdb)“了,我们可以list出源码,并在第5行打上断点,然后continue,等待android端进入nativecode并触发断点。呼叫中心专家接着,eclipse端单步跳过-F6(或者单步跳入-F5),这时ndk-gdb这边的断点被触发,我们可以进行日常的调试工作:调试完成后continue,流程回到eclipse,整个试验性调试过程便可结束。Step-4
本文标题:【Win7下Android native code的编译和调试】
链接地址:https://www.777doc.com/doc-3606567 .html