ubuntu上Android NDK调试配置

android上调试本地c/c++时,可以直接使用gdb在命令行中调试,很麻烦。这里通过sequoyah插件将调试功能集成到eclipse中,在图形界面中调试。下面的参考参考资料中已经说明的很详细了,自己搭建某些地方疏忽了,花了很长时间。

参考了下面几篇文章

http://blog.csdn.net/dfqin/article/details/6901506

http://www.eclipse.org/sequoyah/documentation/native_debug.php

http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html

一、环境配置
我安装的NDK版本为android-ndk-r7b-linux-x86.tar.bz2,此外还需要安装CDT和sequoyah,直接在eclipse中进行安装
1.安装CDT


2.安装sequoyah插件


3.设置环境变量
在/etc/profile中添加以下语句
ANDROID_SDK_TOOLS=$HOME/android-sdk-linux/platform-tools
NDK_HOME=$HOME/android-ndk-r7b/
export PATH=$PATH:$NDK_HOME:$ANDROID_SDK_TOOLS
保存退出后,执行source /etc/profile使用环境变量生效

4.在eclipse中,Window->Preferences->Android中设置本地开发NDK位置


二、建立测试工程
1.现在新建一个Android工程Orange,修改java代码如下
[java] view plain copy print ?
  1. packagecom.gavin.example;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.os.Bundle;
  5. publicclassOrangeActivityextendsActivity{
  6. /**Calledwhentheactivityisfirstcreated.*/
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. newAlertDialog.Builder(this).setMessage(sayHello()).show();
  12. }
  13. publicnativeStringsayHello();//native函数
  14. static{
  15. System.loadLibrary("Orange");
  16. }
  17. }

代码中引用了一个Native函数,用于获取一个字符串


2.在工程名上右键选择Android Tools->Add Native Support


这个界面中,应该是也是可以设置NDK位置的,我的环境可能有些问题,NDK位置不能编译,所以必需在前一步骤中设置。

现在工程目录中应该多了一个jni目录,目录中有两个文件Orange.cpp和Android.mk.


3.在Orange.cpp中添加一个函数

[cpp] view plain copy print ?
  1. #include<string.h>
  2. #include<jni.h>
  3. extern"C"
  4. {
  5. jstringJava_com_gavin_example_OrangeActivity_sayHello(JNIEnv*env,
  6. jobjectthiz);
  7. }
  8. jstringJava_com_gavin_example_OrangeActivity_sayHello(JNIEnv*env,
  9. jobjectthiz)
  10. {
  11. returnenv->NewStringUTF("Hello,I'manOrange!");
  12. }


4.现在编译工程可能提示以下错误信息

[plain] view plain copy print ?
  1. Method'NewStringUTF'couldnotberesolvedcom_permadi_testJNI_TestJNIActivity.c/TestJNIC/jniline6SemanticError
  2. Type'JNIEnv'couldnotberesolvedcom_permadi_testJNI_TestJNIActivity.c/TestJNIC/jniline4SemanticError
  3. Type'jobject'couldnotberesolvedcom_permadi_testJNI_TestJNIActivity.c/TestJNIC/jniline4SemanticError
  4. Type'jstring'couldnotberesolvedcom_permadi_testJNI_TestJNIActivity.c/TestJNIC/jni

解决办法,Properties->c/c++ General/Paths and Symbols->includes
GNU C 添加/home/gavin/android-ndk-r7b/platforms/android-14/arch-arm/usr/include
GNU c++ 也一样
参考http://permadi.com/blog/2011/09/creating-your-first-android-jnindk-project-in-eclipse-with-sequoyah

编译Orange工程,启动模拟器测试一下应该能成功显示"Hello, I'm an Orange!"字符串了

5.设置编译debug标志

修改工程配置文件AndroidManifest.xml,将Debuggable标志设置为true,如下



三、调试器的配置

1.找到NDK目录下的ndk-gdb脚本,注释掉最后一句
# $GDBCLIENT -x $GDBSETUP -e $APP_PROCESS
现在在命令行中进入工程目录,执行ndk-gdb命令,将在obj/local/armeabi中生成了app_process,gdb.setup等新文件

[plain] view plain copy print ?
  1. gavin@gavin-desktop:~/workspace/Orange$ndk-gdb
  2. gavin@gavin-desktop:~/workspace/Orange$lsobj/local/armeabi/
  3. app_processgdb.setuplibc.solibOrange.solibstdc++.aobjsobjs-debug
将上面的gdb.setup文件改名为gdb2.setup,并删除掉最后一句
target remote:5039

选择工程->debug as->debug configurations,在c/c++ Application上右健新建一个配置
2.Main选项卡


c/c++ Application中填写由ndk-gdb命令生成的app_process文件,/home/gavin/workspace/Orange/obj/local/armeabi/app_process
点击最下面的"Select other...",勾选"Use configuration specific setting", 在下面的框中选择"Standard Crete Process Launcher"




3.Debugger选项卡
Debugger中选择"gdbserver"
GDB debugger: /home/gavin/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb

GDB command file: /home/gavin/workspace/Orange/obj/local/armeabi/gdb2.setup

最好勾选一下最下面的"verbose console mode",这样在console中会输出gdb命令信息



切换到Connection子选项卡
协议类型选择"TCP",端口号填"5039"
四、调试

1.在java中调用native方法处添加断点,c++函数中也设置断点,启动java项目调试,这时程序应该在调用native方法处中断。

2.现在命令行进入工程目录,执行ndk-gdb。刚开始的时候我忽略了这一步,结果出现下面的错误,纠结了两个小时

[plain] view plain copy print ?
  1. Targetselectionfailed.
  2. Remotecommunicationerror:Connectionresetbypeer.
  3. Remotecommunicationerror:Connectionresetbypeer.
  4. Remotecommunicationerror:Connectionresetbypeer.

3.工程属性->debug as->debug configurations,在c/c++ Application中选中Orange Default配置,点击“Debug”

更多相关文章

  1. Android通过Wifi来调试你的应用(转自stormzhang博客)
  2. Android(安卓)Studio 调试过程中快捷查看断点处变量值(Ctrl+Shift
  3. android中TextView中如何设置水平滚动效果
  4. Android(安卓)高手进阶,自定义圆形进度条
  5. android中TextView中如何设置水平滚动效果
  6. Android(安卓)打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单
  7. android 中一个项目工程引用另一个项目工程和jar
  8. Android(安卓)APN的设置问题
  9. Android如何完全调试framework层代码

随机推荐

  1. golang 主要做什么
  2. golang 如何安装包
  3. golang 优秀框架有哪些
  4. golang 如何debug
  5. golang 引用和指针的区别
  6. golang 内存泄露的原因
  7. golang 为什么高并发
  8. golang 默认几核运行
  9. golang 适合做web开发吗
  10. golang可以跨平台吗