光为这编译及调试环境就前后折腾了两三天,墙外找了很多教程,bill以为以下教程最为贴切

Using eclipse for android - cc Development

Using eclipse for android - cc Dubugging

       自己跟着教程一步一步做下去,期间也不乏出现懊恼的问题,虽煞费周折,但最终还是尝到了编译调试native code的甜头。故模仿前文,以step-by-step方式记之,以备后用。
----------------------------cut line-------------------------------
Step-0  环境准备
       开发及编译环境的下载和安装工作,网上已连篇累牍,恕我不再赘述。以下仅列出本次教程所用到的环境及版本,用以核对。
       1)普通的android开发环境(打算调试native code的朋友应该都已经具备这环境,我自己使
               用的是Eclipse juno + ADT-ver: 21.0.1 + Android SDK + JDK6),本文使用的
eclipse经过了汉化,bill已经将links汉化包上传,有需要的朋友可自行下载。
       2)Cygwin 1.7.x
Cygwin的安装需要注意开发包的下载,其默认为Default,我们需要自行选择必要的开
               发工具包,展开Devel节点
               依次选择如下工具包后,点击下一步完成安装。
       3)android-ndk-r8d
       4)Eclipse juno CDT插件 - ver 8.1.1
Step-1  新建Android Demo工程
       新建一个android工程NativeDebugDemo,使用android api 9(bill只在api-9和api-14上调试过,其它版本尚未涉足)。

运行以确定基本的android环境能够正常工作。

Step-2  新建并使用ndk-build编译本项目的native code

在Eclipse中右击本项目名,新建文件夹,命名为jni(大小写敏感),在jni文件夹中新建文件,命名为Android.mk(大小写敏感),继续在jni目录下新建文件,命名为 demo.c

在src目录下新建包com.nativetools,并新建类NativeDemo(这个类仅仅为了将native code的声明与普通android代码声明分离,以为下一篇文章中提到的代码复用做准备)。

编写类代码如下,对即将编写的native code进行声明(提示的警告可忽略):

  1. package com.nativetools;

  2. publicclass NativeDemo {

  3. static{

  4. System.loadLibrary("DemoModule");  //加载native code的动态库libDemoModule.so,稍后解释

  5. }

  6. publicnativeint max(int a, int b);  //声明函数max为native code,具体写法请参照Oracle JNI doc

  7. }

接下来需要编写我们的本地代码及Android.mk文件,在demo.c中编写用于本次Demo的本地C代码如下,注意本地函数的命名结构:

Java_

com_nativetools_NativeDemo_

max

必须以“Java_”开头,中间加上android中声明该函数的类的限定名,此处就是之前的com.nativetools.NativeDemo(点号全部替换成下划线,大小写敏感),最后才是该函数的名称“max”(关于本地代码的函数命名及相关规范请参照Oracle JNI doc):

demo.c

  1. #include<jni.h>

  2. JNIEXPORT jint JNICALL

  3. Java_com_nativetools_NativeDemo_max(JNIEnv *env, jobject jthis, jint a, jint b){

  4. return a > b ? a : b;

  5. }

接着,我们需要向android-ndk描述我们的本地代码,编写Android.mk如下

Android.mk

  1. LOCAL_PATH := $(call my-dir)

  2. include $(CLEAR_VARS)

  3. LOCAL_MODULE    := DemoModule

  4. LOCAL_SRC_FILES := demo.c

  5. include $(BUILD_SHARED_LIBRARY)

关于Android.mk文件的写法请参照本地文档/android-ndk-r8d/doc/ANDROID-MK.htlm

代码准备工作就绪,接下来需要配置Eclipse以完成本次Demo的编译工作。

首先,为了在Eclipse中编译本地代码,需要将当前android项目转换成android + C/C++混合项目。右击本项目名,新建→其它,选择“Convert to C/C++ Project(Adds C/C++ Nature)”

在接下来的对话框中选中本项目(默认已经选中),选择“Convert to C Project”,在“Project type:”框中选择“Makefile project”,在右边“Toolchains”中选择“--Other Toolchain”,点击“完成”,弹出对话框询问是否打开C/C++透视图,选择“是”即可。

现在打开demo.c源文件,可以看到CDT已经起了作用,demo.c中出现了很多无法识别的类型,接下来就需要进行C/C++相关的配置,引入必要的include路径以解决这些问题。

右击项目名,选择“属性”,在弹出的属性设置框中选择“C/C++ Build”,在右边“Builder Settings”中取消“Use Default build command”,并修改“Build command”路径为你本机ndk-build.cmd程序的路径,以bill自己的为例:“E:\Android_SDK\android-ndk-r8d\ndk-build.cmd”,点击”应用“。

切换到”Behaviour“选项卡,将”Build(Incremental build)“栏的”all“命令删除,点击”应用“。

接着在左边边侧栏选择”C/C++ General“→”Paths and Symbols“,在右边的”Includes“一栏选择”GNU C“,点击”Add“。

点击”File system...“,选择android ndk对应平台(本项目是android api-9)的include路径(里面除了arch-arm以外还有两个平台,这里不用,详情请参考android-ndk doc),以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-ndk doc)而在类NativeDemo中加载的库正是”DemoModule“。

Step-3  在android中调用native code

前面已经完成了native code的编译工作,接下来我们需要在android中调用native code以验证其正确与否。

为简单起见,bill直接在MainActivity的onCreate方法中进行试验。修改onCreate方法如下:

  1. ...

  2. import com.nativetools.NativeDemo;

  3. publicclass MainActivity extends Activity {

  4. @Override

  5. protectedvoid onCreate(Bundle savedInstanceState) {

  6. super.onCreate(savedInstanceState);

  7. setContentView(R.layout.activity_main);

  8. NativeDemo nativetools = new NativeDemo();

  9. Integer maxNum = nativetools.max(0, 1);  //调用本地函数 max

  10. new AlertDialog.Builder(this).setMessage(maxNum.toString()).show();

  11. }

  12. ...

完成后运行程序,可以看到弹出窗口中显示数字”1“,我们的native code已经成功运行。

Step-4  native code的调试

作为一个开发人员,bill认为调试所占用的时间远远超过了单纯的开发用时。如本文所述,我们在Step-3“开发”了一个调用native code的android试验程序,但只要是程序就有bug,调试是必不可少的阶段,下面bill就怎么在eclipse上对native code进行调试加以阐释,仿照前人的做法,分两个部分展开。

一者,用eclipse调试java代码,并结合ndk-gdb以命令行的方式调试native code。

一者,将二者合二为一,统一使用eclipse进行图形化调试(这种方法使得调试变得直观,但性能很糟糕)。

Step-4-1  eclipse + ndk-gdb调试native code

首先我们需要将本项目设置为”可调试“。打开”AndroidManifest.xml“,设置”Debuggable“为”true“。

然后在eclipse中给java代码打好断点,为简单起见,bill把断点打在native code:max的入口处,启动本项目的调试,待步进指示器停止在断点处。

打开Cygwin终端,cd进入本项目的根目录,执行android-ndk-r8d根目录下的ndk-gdb脚本,为了查看启动过程,加入verbose选项,即输入命令”$ndk/ndk-gdb --verbose“(此处的”$ndk“是系统环境变量,指向android-ndk-r8d的根目录,请自行配置),启动如下:

可以看到一个warning,警告有48个lib未能找到,其中包括”libstdc++.so“等,NDK官方文档里告诉大家:请直接忽略本警告~(bill当时花了大力气想解决这个问题,无果,直到参看NDK doc......)

到这里就是大家所熟悉的”(gdb)“了,我们可以list出源码,并在第5行打上断点,然后continue,等待android端进入native code并触发断点。

接着,eclipse端单步跳过-F6(或者单步跳入-F5),这时ndk-gdb这边的断点被触发,我们可以进行日常的调试工作:

调试完成后continue,流程回到eclipse,整个试验性调试过程便可结束。

Step-4-2  使用eclipse统一调试native code

不得不说,现阶段性价比最高的调试方式就是eclipse + ndk-gdb了,虽然java与native code的调试分居两地,但不论从性能还是配置的简洁程度,都优于接下来要说的统一调试。对于这个统一调试法,bill也是学习了前人的配置,折腾半天才弄出来,所以希望以清晰的文字做个记录。

首先,复制android-ndk-r8d根目录下的”ndk-gdb“脚本到新文件”ndk-gdb-eclipse“,将最后一行“$GDBCLIENT -x `native_path $GDBSETUP`”注释掉或者直接删除(最好别用记事本打开,bill直接用的VS - -+),如图:

然后进入本项目的”\obj\local\armeabi“目录,复制”gdb.setup“到新文件”gdb2.setup“,打开”gdb2.setup“并将”target remote :5039“这一句删除,保存退出。

现在该目录下应该有如下文件,其中”app_progress“、”gdb2.setup“是一会需要用到的,如果缺少其中任意一个,请在Cygwin中,于本项目根目录下运行一次”$ndk/ndk-gdb“即可。

准备工作就绪,现在回到eclipse,点击”调试“按钮旁的下拉箭头,选择”调试配置“,双击”C/C++ Application“,在右边的”main“选项卡中点击下方的”选择其他“。

进入后勾选”覆盖工作空间设置“,并选择”Standard Create Progress启动程序“。

确定退出,接着在C/C++ Application一栏填写上面提到的app_progress的绝对路径,bill本机设置如下:

点击”应用“,然后切换到”Debugger“标签,在下方的”Debugger“栏中选择”gdbserver“,勾选”stop on startup at:“并填写我们的native函数名”Java_com_nativetools_NativeDemo_max“(也可以不勾选,在调试时打断点即可)

接着在”GDB debugger“一栏选择对应的ndk-gdb版本,在bill本机为”E:\Android_SDK\android-ndk-r8d\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gdb.exe“,然后在”GDB command file:“一栏选择我们前面提到的”gdb2.setup“,接着勾选下面的两个选项,以达到在eclipse的控制台中与gdb进行交互的目的。

点击”应用“并切换到”connection“标签,选择”Type“为TCP,”Port number“为5039,保存退出。

一切准备工作就绪了,下面就开始在eclipse中进行统一的调试。注意各调试选项的启动步骤,否则容易出现java断点不命中,或者native code无法调试的现象。

首先,老样子,在java代码里打上断点,启动普通调试选项,等待步进指示器停止在断点处。

接着在Cygwin中,于本项目根目录执行”ndk-gdb-eclipse“脚本,即命令”$ndk/ndk-gdb-eclipse --verbose“,执行成功后不会进入gdb界面,稍后我们将在eclipse中见到(gdb)。

待启动完成后,回到eclipse,点击调试按钮旁的下拉箭头,选择我们上面配置的那个C/C++调试配置,如果没有,点击”调试配置“,在里面选择上面配置好的那个,点击”调试“。

等待启动完成后,我们会看到一个错误:

不用管它,这是由于前文说的那个warning造成的,忽略掉即可。这时我们便能在eclipse的控制台中看到(gdb)了,你可以就在这里和eclipse进行交互,或者直接使用可视化调试,进入demo.c源文件,在需要断点的地方双击,即可看到断点信息被同步到ndk-gdb中,然后同样在eclipse单步跳入或者跳过,即可进入native code进行日常调试。

-----------------cut line------------------------

Summary

本次开发环境的下载、安装及配置总耗时约4天,现在想来,其实也蛮简单,但作为新手的自己,才开始配置的时候的确遇到了诸多困扰,幸得网上各位博主所写文章的启迪和帮助,才成功搭建平台。因此,技术博客的普及性及重要性可见一斑。

bill希望自己也能在今后的开发生涯中不断地积累经验,不断地用清晰的文字和逻辑记录和分享自己所学所得,这也是作为一个博主最基本的使命吧。

Next

下一篇文章bill将简单介绍如何在另一个android应用中使用我们本文编译生成的“libNativeDemo.so”动态链接库。

附件:http://down.51cto.com/data/2362213

本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/1125039,如需转载请自行联系原作者

【Win7下Android native code的编译和调试】相关推荐

  1. win7下android开发环境搭建(win7 64位)

    注意:此为win7 (64)位系统 那么win7下32位系统如何进行android开发环境搭建呢?>>>win7下android开发环境搭建(win7 32位) 一.安装 JDK 下 ...

  2. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  3. linux下ant编译android,linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...

    之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量多渠道,打包生成apk文件>,关于ant打包原理,请先阅读这篇文章.再次不再赘述. 我使用的Linux环境 ...

  4. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...

    之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量多渠道,打包生成apk文件>,关于ant打包原理,请先阅读这篇文章.再次不再赘述. 我使用的Linux环境 ...

  5. 内网中如何在Win7下使用VS code远程调试

    内网中如何在Win7下使用VS code远程调试 1 背景介绍 很多时候,我们不得不面对这样的情况,我们工作环境下的机器不能连接外网(Internet),而且,服务器是Linux环境(Ubuntu,C ...

  6. Win7下android开发环境搭建

    所需软件安装包 1.  JDK.文件名为jdk-6u22-windows-i586.exe. 下载地址:http://www.oracle.com/technetwork/java/javase/do ...

  7. Win7下Android开发环境的搭建(更新于2015/3)

    Win7下Android开发环境的搭建(更新于2015/3) --JDK + Eclipse + Android SDK + ADT 的安装.配置 Android开发环境搭建并不复杂,就是资源不好下, ...

  8. php5.3 本地调试,WIN7下PHP 5.3.27和PHPStorm6调试

    WIN7下PHP 5.3.27和PHPStorm6调试 1.PHP配置如下,加黄色高亮的是必须项 [PHP_XDEBUG] ;extension=php_xdebug.dll [Xdebug] zen ...

  9. Q115:Linux系统下CodeBlocks对PBRT-V3进行编译和调试

    我也是醉了,在各种环境下对PBRT-V3进行了编译和调试. 参考:Q113:PBRT-V3分别在Linux和Mac下的编译与调试(汇总) 不过,小编对CodeBlocks"情有独钟" ...

最新文章

  1. 数据库系统概念总结:第三章 SQL
  2. L1-011 A-B (20 分)(c语言实现)
  3. C# WPF发票打印
  4. python3 super_Python super()– Python 3 super()
  5. MVC和MTV初步认识+django的一个简单应用(萌新交流互动,欢迎大家指出错误)
  6. 荐书丨如何快速成为150万+小程序开发者中的一员
  7. 《剑指offer》第二十三题(链表中环的入口结点)
  8. jsp大学计算机知识点,大学计算机规划教材:JSP大学实用教程
  9. ubuntu配置搜狗输入法
  10. 扫一下这个神奇的二维码,Wifi不用输密码
  11. 核心路由器十项性能指标与路由器简介
  12. python pyd_python项目(.pyd或者.so)代码加密
  13. hive分隔符_hive默认分隔符
  14. 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名
  15. JVM学习笔记07-垃圾回收
  16. 如何免费安装并激活序列号iMazing软件
  17. C++ new失败处理
  18. 网赚最忌讳的行为5个行为,新人必读!
  19. sony xl39h android 4.3,索尼XL39h 4.3解锁教程和方法
  20. 推荐14款强大的Mac修图利器,简约创意,让你随心所欲的创作

热门文章

  1. 十一、递归----迷宫问题
  2. 葫芦岛天气预报软件测试,[软件工具][软件游戏]IM智能机器人小强--给你生活带来方便和快乐!(转载)...
  3. 查看git当前tag_git对象浅析
  4. matlab里1stopt,请帮忙运行下1stopt 程序?(MATLAB没有解出结果)
  5. 服务器mac地址查询修改,服务器mac地址查询修改
  6. android 半透明pop,Android实现AppCompatActivity全屏半透明
  7. c++ 打开添加删除程序_Docker 添加容器到一个网络
  8. Spring Cloud Alibaba 学无止境:下一代微服务架构的规划与展望
  9. mysql datetime转换为date_MySQL date,datetime,timestamp区别及相互转换
  10. assert python 中断_Python这十大装B语法!你不会还没有听过吧?