Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6684998
  • 博文数量: 1159
  • 博客积分: 12444
  • 博客等级: 上将
  • 技术积分: 12570
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-13 21:34
文章分类

全部博文(1159)

文章存档

2016年(126)

2015年(350)

2014年(56)

2013年(91)

2012年(182)

2011年(193)

2010年(138)

2009年(23)

分类: C/C++

2015-09-13 12:25:49

http://blog.csdn.net/guqiwei/article/details/7279505

在做Android本地程序开发时,Google为我们提供了NDK开发环境,如果只是很小的工程,用NDK开发还是很方便的。但是如果是很大的工程,代 码文件很多的时候,手工支配置android.mk文件还是很繁锁的。虽然Google不建议我们用NDK开发大规模的工程,但是在很多时候,例如,现有 游戏或者其它工程的移植时,还是不可避免的。本文将介绍一种利用eclipse进行传统C++开发的方法。

一、 开发篇

1. 创建工程打开eclipse新建C++工程-->键入工程名并选择Hello World C++ Project-->Finish

                                                  创建C++工程

                                            选择Hello World工程

2. 设置工程属性右键工程-->选择属性-->C/C++Build-->Tool Chain Editor : 

                                                                 选择工具链

注意:如果没有所需的工具链选择,可能是eclipse的版本不对。

3. 设置工具链属性右键工程-->选择属性-->C/C++Build-->Settings

                                                         工具链设置

3.1. [Cross Settings]

[plain] view plaincopy
  1. Prefex : arm-linux-androideabi-  
  2. Path : /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/  
注意:
[plain] view plaincopy
  1. 1. Path是指工具链的根目录,并不是可执行文件的目录,所以不需要加上 “/bin”目录。  
  2. 2. /home/q/Workspace/Andriod/NDK/是NDK的根目录,请根据自己的情况选择。以下设置相同。  
3.2. [Cross GCC Compiler]
[plain] view plaincopy
  1. Include Paths :  
  2.  /home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/include  
  3.  /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/include  
  4.  /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/include  
  5.  /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/include  
  6.  /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/include-fixed/  
  7.  /home/q/Workspace/Andriod/NDK/sources/cxx-stl/stlport/stlport/  
  8. Miscellaneous:  
  9.  Other Flags :-c -fmessage-length=0 -DANDROID -fno-exceptions  
 如果使用stlport,“-DANDROID -fno-exceptions” 选项是必须的否则 stlport中的 #include_next 没法使用,会报如下错误:
[plain] view plaincopy
  1. /home/q/Workspace/Andriod/NDK/sources/cxx-stl/stlport/stlport/stl/_cstddef.h:29:30: error: cstddef: No such file or directory  
钩选:-fPIC
3.3. [Cross G++ Compiler] 同 3.2。
3.4. [Cross G++ Linker]General: -nostdlibLibraries:添加的库:
c
m
stdc++
stlport
库路径:
/home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/lib
/home/q/Downloads/android_bak/NDK/sources/cxx-stl/stlport/libs/armeabi-v7a

                                                            Libraries设置

注意:在/home/q/Downloads/android_bak/NDK/sources/cxx-stl/stlport/libs/armeabi-v7a路径下是没有libstlport.so文件的。我们需要从我们自己的设备上把此文件下载下来:

adb shell pull /system/lib/libstlport.so /home/q/Downloads/android_bak/NDK/sources/cxx-stl/stlport/libs/armeabi-v7a

Miscellaneous:其它选项:
-R/home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/lib
其它对象:/home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/lib /crtbegin_dynamic.o/home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/lib/crtend_android.o

                                                      链接器选项

这样开发的配置就已经完成了,编译一下试试看吧!

adb push ./HelloWorld /data/td/
adb shell /data/td/HelloWorld

注意:如果将程序放到sdcard上是不能执行的,即使已经root了,chmod也设置不了权限的。

二、 调试篇

           虽然在NDK里面有ndk-gdb的工具使我们可以调试ndk-build编译出来的程序,但是它需要android.mk文件,从上一篇的介绍中我们并 没有生成此文件。还有其它方法可以用吗?分析ndk-gdb文件我们提取出下面这些有用信息。首先我们以命令行的方式来模拟ndk-gdb的操作:

1. 在设备上启动gdbserver监听gdb的请求:

[plain] view plaincopy
  1. root@g:~# adb devices  
  2. List of devices attached  
  3. 353046FDC1EE00EC        device  
  4.   
  5. root@g:~# adb push /home/q/Workspace/cmu_test_remote/HelloWorld/Debug/HelloWorld  /data/td/  
  6. 1002 KB/s (136536 bytes in 0.132s)  
  7. root@g:~# adb push /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver /system/xbin/  
  8. 893 KB/s (125208 bytes in 0.136s)  
  9. root@g:~# adb shell gdbserver :5039 /data/td/HelloWorld  
  10. Process /data/td/HelloWorld created; pid = 21867  
  11. Listening on port 5039  
2. 进行端口重定向:
[plain] view plaincopy
  1. adb forward tcp:5039 tcp:5039  

因为gdb需要通过TCP或者串口进行连接,但大多数情况下我们是用USB线进行连接的,所以需要进行端口重定向。

3. Gdb 打开程序,进行调试:

[plain] view plaincopy
  1. root@g:~# /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb /home/q/Workspace/cmu_test_remote/HelloWorld/Debug/HelloWorld  
  2. GNU gdb 6.6  
  3. Copyright (C) 2006 Free Software Foundation, Inc.  
  4. GDB is free software, covered by the GNU General Public License, and you are  
  5. welcome to change it and/or distribute copies of it under certain conditions.  
  6. Type "show copying" to see the conditions.  
  7. There is absolutely no warranty for GDB.  Type "show warranty" for details.  
  8. This GDB was configured as "--host=x86_64-linux-gnu --target=arm-elf-linux"...  
  9. (gdb)  
这里的gdb的版本一定要正确。这时已经进入了gdb调试模式,还需要进行与远程的gdbserver进行连接,在gdb模式下输入:
[plain] view plaincopy
  1. (gdb) target remote :5039  
  2. Remote debugging using :5039  
  3. warning: Unable to find dynamic linker breakpoint function.  
  4. GDB will be unable to debug shared library initializers  
  5. and track explicitly loaded dynamic code.  
  6. 0xb0001000 in ?? ()  
  7. (gdb) l  
  8. 4       // Version     :  
  9. 5       // Copyright   : Your copyright notice  
  10. 6       // Description : Hello World in C++, Ansi-style  
  11. 7       //============================================================================  
  12. 8  
  13. 9       #include <iostream>  
  14. 10      using namespace std;  
  15. 11  
  16. 12      int main() {  
  17. 13              cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!  
  18. (gdb) b main  
  19. Breakpoint 1 at 0x84e8: file ../src/HelloWorld.cpp, line 13.  
  20. (gdb) c  
  21. Continuing.  
  22. Error while mapping shared library sections:  
  23. /system/bin/linker: No such file or directory.  
  24. Error while mapping shared library sections:  
  25. libc.so: Success.  
  26. Error while mapping shared library sections:  
  27. libm.so: Success.  
  28. Error while mapping shared library sections:  
  29. libstdc++.so: Success.  
  30. Error while mapping shared library sections:  
  31. libstlport.so: Success.  
  32.   
  33. Breakpoint 1, main () at ../src/HelloWorld.cpp:13  
  34. 13              cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!  
  35. (gdb) c  
  36. Continuing.  
  37.   
  38. Program exited normally.  
  39. (gdb)  

至此已经完成了整个程序的调试过程。

4. 与Eclipse集成虽然通过命令行已经可以对程序进行调试,但毕竟没有图形界面的方便,下面将介绍如何将gdb调试与Eclipse进行集成。

4.1. 到Eclipse中选中需调试的工程 ,打开Debug Configurations..

打开Debug Configurations

4.2. 在打开的Debug Configurations中新建C/C++ Remote Application在main页面中设置:Connection: localRemote Absolute File Path : /data/td/HelloWorldCommands to execute before application:

[plain] view plaincopy
  1. /home/q/Workspace/Andriod/SDK/platform-tools/adb shell gdbserver :5039 /data/td/HelloWorld  
  2. /home/q/Workspace/Andriod/SDK/platform-tools/adb forward tcp:5039 tcp:5039  

注意,这里的adb路径一定要完整路径。最后还要选中 “Skip download to target path”

                                                   HelloWorld Debug设置

]转到Debugger页片,填入gdb的完整路径,并将GDB command file置空。

                                Debug gdb路径设置

至此配置工作全部结束,直接点击调试吧。

参考:

1. Android Native Development Using the Android Open Source Project[OL]. http://www.aton.com/android-native-development-using-the-android-open-source-project/
2. Debugging with GDB[OL]. http://blog.csdn.net/wei801004/article/details/4253911
4. How C/C++ Debugging Works on Android[OL].

阅读(667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~