本文欢迎转载,但请注明出处。源文链接: 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]

Prefex : arm-linux-androideabi-Path : /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/
注意:
1. Path是指工具链的根目录,并不是可执行文件的目录,所以不需要加上 “/bin”目录。2. /home/q/Workspace/Andriod/NDK/是NDK的根目录,请根据自己的情况选择。以下设置相同。
3.2. [Cross GCC Compiler]
Include Paths : /home/q/Workspace/Andriod/NDK/platforms/android-9/arch-arm/usr/include /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/include /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/include /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/include /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/ /home/q/Workspace/Andriod/NDK/sources/cxx-stl/stlport/stlport/Miscellaneous: Other Flags :-c -fmessage-length=0 -DANDROID -fno-exceptions
如果使用stlport,“-DANDROID -fno-exceptions” 选项是必须的否则 stlport中的 #include_next 没法使用,会报如下错误:
/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:添加的库:
cmstdc++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的请求:

[email protected]:~# adb devicesList of devices attached353046FDC1EE00EC        device[email protected]:~# adb push /home/q/Workspace/cmu_test_remote/HelloWorld/Debug/HelloWorld  /data/td/1002 KB/s (136536 bytes in 0.132s)[email protected]:~# adb push /home/q/Workspace/Andriod/NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver /system/xbin/893 KB/s (125208 bytes in 0.136s)[email protected]:~# adb shell gdbserver :5039 /data/td/HelloWorldProcess /data/td/HelloWorld created; pid = 21867Listening on port 5039
2. 进行端口重定向:
adb forward tcp:5039 tcp:5039

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

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

[email protected]:~# /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/HelloWorldGNU gdb 6.6Copyright (C) 2006 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB.  Type "show warranty" for details.This GDB was configured as "--host=x86_64-linux-gnu --target=arm-elf-linux"...(gdb)
这里的gdb的版本一定要正确。这时已经进入了gdb调试模式,还需要进行与远程的gdbserver进行连接,在gdb模式下输入:
(gdb) target remote :5039Remote debugging using :5039warning: Unable to find dynamic linker breakpoint function.GDB will be unable to debug shared library initializersand track explicitly loaded dynamic code.0xb0001000 in ?? ()(gdb) l4       // Version     :5       // Copyright   : Your copyright notice6       // Description : Hello World in C++, Ansi-style7       //============================================================================89       #include <iostream>10      using namespace std;1112      int main() {13              cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!(gdb) b mainBreakpoint 1 at 0x84e8: file ../src/HelloWorld.cpp, line 13.(gdb) cContinuing.Error while mapping shared library sections:/system/bin/linker: No such file or directory.Error while mapping shared library sections:libc.so: Success.Error while mapping shared library sections:libm.so: Success.Error while mapping shared library sections:libstdc++.so: Success.Error while mapping shared library sections:libstlport.so: Success.Breakpoint 1, main () at ../src/HelloWorld.cpp:1313              cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!(gdb) cContinuing.Program exited normally.(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:

/home/q/Workspace/Andriod/SDK/platform-tools/adb shell gdbserver :5039 /data/td/HelloWorld/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://www.kandroid.org/online-pdk/guide/debugging_gdb.html
3. GDB 命令详细解释 [OL]. http://blog.csdn.net/wei801004/article/details/4253911
4. How C/C++ Debugging Works on Android[OL]. http://mhandroid.wordpress.com/2011/01/25/how-cc-debugging-works-on-android/
5. ndk-gdb[OL]. http://csipsimple.googlecode.com/svn/trunk/pjsip_android/ndk-gdb

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 图文来教你在eclipse下用gradle 来打包Android
  6. android 入门不顺啊,解压android_gingerbread_realv210_ver_1_0.t
  7. 【iOS-cocos2d-X 游戏开发之三】Mac下配置Android(安卓)NDK环境
  8. Android(安卓)SO文件的概念、兼容、适配和可能的错误
  9. 【转】制作不暴露源码的Android(安卓)Library Project

随机推荐

  1. android无线内网打印机打印出图片
  2. android uri的用法
  3. 推荐4款开源的Android引导页控件
  4. 漫谈android系统(1)解析android编译
  5. Arduino 制作蓝牙开关
  6. linux程序崩溃调试技术
  7. Android(安卓)漂亮的 Dialog (弹出框)
  8. Android支付Demo运行大坑
  9. Android(安卓)sdk更新过程中出现问题 (连
  10. Android利用CountDownTimer实现倒计时功