ubuntu上Android NDK调试配置

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代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.gavin.example; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; public class OrangeActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); new AlertDialog.Builder( this ).setMessage(sayHello()).show(); } public native String sayHello(); //native函数 static { System.loadLibrary( "Orange" ); } }

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

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


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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <string.h> #include <jni.h> extern "C" { jstring Java_com_gavin_example_OrangeActivity_sayHello( JNIEnv* env, jobject thiz ); } jstring Java_com_gavin_example_OrangeActivity_sayHello( JNIEnv* env, jobject thiz ) { return env->NewStringUTF( "Hello, I'm an Orange!" ); }

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

1 2 3 4 Method 'NewStringUTF' could not be resolved com_permadi_testJNI_TestJNIActivity.c /TestJNIC/jni line 6 Semantic Error Type 'JNIEnv' could not be resolved com_permadi_testJNI_TestJNIActivity.c /TestJNIC/jni line 4 Semantic Error Type 'jobject' could not be resolved com_permadi_testJNI_TestJNIActivity.c /TestJNIC/jni line 4 Semantic Error Type 'jstring' could not be resolved com_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等新文件

1 2 3 gavin@gavin-desktop:~/workspace/Orange$ ndk-gdb gavin@gavin-desktop:~/workspace/Orange$ ls obj/local/armeabi/ app_process gdb.setup libc.so libOrange.so libstdc++.a objs objs-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。刚开始的时候我忽略了这一步,结果出现下面的错误,纠结了两个小时

1 2 3 4 Target selection failed. Remote communication error: Connection reset by peer. Remote communication error: Connection reset by peer. Remote communication error: Connection reset by peer.

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

更多相关文章

  1. android:gravity / android:layout_gravity区别
  2. Android入门教程(三)之------导入现有Android工程
  3. Android调用内置的无线信息隐藏菜单[转]【待验证】
  4. Android入门教程(三)之------导入现有Android工程
  5. Android(安卓)视频播放器 faplayer 编译
  6. 设置控件的透明度 ,android:layout_centerInParent="true" 失效
  7. Android(安卓)BitmapShader 实战 实现圆形、圆角图片
  8. Android布局文件中控件的高度与宽度属性设置
  9. android:padding 和 android:margin的区别

随机推荐

  1. Android找到本地联络人并向其发邮件
  2. 移动平台Dialog内按键顺序研究
  3. Android(安卓)ndk开发 打包成apk后 找不
  4. android MapView 定位与Overlay onTap事
  5. [Android问答] 开发环境问题集锦
  6. Android(安卓)studio中Git的学习和使用心
  7. Java转Android开发不得不知的一些经验
  8. 【Android】Android的消息机制
  9. Linux/Android——Input系统之InputMappe
  10. Android(安卓)NDK下编译google protocol