android上调试本地c/c++时,可以直接使用gdb在命令行中调试,很麻烦。这里通过sequoyah插件将调试功能集成到eclipse中,在图形界面中调试。下面的参考参考资料中已经说明的很详细了,自己搭建某些地方疏忽了,花了很长时间。
参考了下面几篇文章
http://blog.csdn.net/dfqin/article/details/6901506http://www.eclipse.org/sequoyah/documentation/native_debug.php
http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html
4.在eclipse中,Window->Preferences->Android中设置本地开发NDK位置
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
现在工程目录中应该多了一个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
|
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 command file: /home/gavin/workspace/Orange/obj/local/armeabi/gdb2.setup
最好勾选一下最下面的"verbose console mode",这样在console中会输出gdb命令信息
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”