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
ubuntu上Android NDK调试配置_第1张图片

2.安装sequoyah插件
ubuntu上Android NDK调试配置_第2张图片

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位置

ubuntu上Android NDK调试配置_第3张图片

二、建立测试工程
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

ubuntu上Android NDK调试配置_第4张图片
这个界面中,应该是也是可以设置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,如下

ubuntu上Android NDK调试配置_第5张图片

三、调试器的配置

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选项卡
ubuntu上Android NDK调试配置_第6张图片

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"
ubuntu上Android NDK调试配置_第7张图片



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命令信息

ubuntu上Android NDK调试配置_第8张图片

切换到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 图片占用进程的内存算法
  2. Android Fresco图片加载库基础使用详解
  3. android 中一个项目工程引用另一个项目工程和jar
  4. Android React Native加载图片资源的正确姿势
  5. 【移动开发】Android中图片过大造成内存溢出,OOM(OutOfMemory)异常
  6. Android仿淘宝首页UI(附代源代码及示例图片)
  7. Android换肤功能设计与实现(5)——网络加载及图片内存管理
  8. Android OpenGLES2.0(八)——纹理贴图之显示图片
  9. Android处理图片OOM的若干方法小结

随机推荐

  1. android调用高版本api函数的兼容性问题
  2. 【iOS 入门】对比android handler学习NSO
  3. 【Android 异步操作】AsyncTask 异步任务
  4. Android 创建与解析XML
  5. Android(安卓)通过包名打开App的代码
  6. android知识杂记(一)
  7. Android OnGestureListener 判断手势上下
  8. Android 重新编译frameworks/base/core/r
  9. Android okhttp3 创建Socket的底层实现追
  10. Android Support Design Library使用详解