首先是习惯了IDE界面,在gdb命令下真的不方便。gdb调试这前是用ndk-build编译。.so。用ndk-build编译编译时,在JNI的调用用中比如 public native String stringFromJNI(); 这个函数在代码编辑中会显示找不到的错误。 build就是了,不要管它。ndk-build和AS的容合没有CMAKE做的好。要写代码的自已保证名字参数的一致性,如非必要还是用CMAKE好。
1,准备工作,要做好。ndk-gdb-py或者ndk-gdb,是停在libc这个库的入口和出口处的。如果你的代码不能,在这之后由人品输入调用的话,是永远不会进入到你自已的lib代码中的。所以对lib的调用写成由用户接口调用吧。只少调试时要这样调用。因为都gdb是命令,就是命令输入键码去调用自已lib的中函数吧。
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
desc = String.format("%s输入的软按键编码是%d,动作是按下", desc, keyCode);
if (keyCode == KeyEvent.KEYCODE_A) {
desc=stringFromJNI();
}
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
Log.d(TAG, desc);
return true;
} else {
//返回true表示处理完了不再输入该字符,返回false表示给你输入该字符吧
return false;
}
这个boolean onKey还要显式的
EditText tv = (EditText) findViewById(R.id.sample_text);
tv.setOnKeyListener(this);
这在oncreate中调用就是了,主要是这tv还不能是 textview还必须是能输入的EditText。算了,如果在应用中直接影响按键有空再去找找吧。可能是因为引的OnKeyListener 是 android.view.View.OnKeyListener;下面的类别。别一个是对话类别的,有一个能用就这样调吧。这样做只是引入手工对代码的可控多次调用。
2,启动代码用
ndk-gdb-py --verbose --start --nowait --adb D:\android-sdk\platform-tools\adb.exe
我没把adb加入的系统路径中,所以要指示出。 --nowait 与--start就加吧。不加上,自已到gdb命令下又要补一些命令。我的应用中没这个必要。
3,进入gdb命令模式了。进不了的话--verbose参数打出的信息好好看看,找一找原因。
第一个常用命令就是加断点 b(全称是breakpoint)
b Java_com_home_ququ_videotest_MainActivity_stringFromJNI 加在JNI调用入口
b native-lib.cpp:12 加在实现的CPP其中一有效行。12是行数,就是cpp中什么都上的行数。与AS标的行号是一至的。
d (delete) 删除全部断点。d 1 册一号断点。
info break 打印全部断点。
p (变量名) 打印变量值,变量一定要有效。也就是停止的断点的作用域中,要有这个变量。
b 不带参数,现显现在的断点。
x(examine) 用于显示内存。x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
quit或者ctl+c可以退出gdb命令模式。
如果命令不熟,用help。但这个可能没用百度好用,因不没示例,没有百度上找到的有示例的命令用法,上手快。基本上能看看变是,看看程序是路到了什么地方,在什么地方出现分支了,就满足初步的应用了。
如果gdb中间出现卡死,就要再开一个adb命令窗口,进入kill两个进程,gdbserver与app两个进程都清一下。然后就重新重第一步开始。不熟gdb命令的话,真的容易卡死。
最后,有个android的问题,代码找时间不活动,会出现无响影报错,看上去还是要找一找,不通过界面后台手工调用lib的函数的方法。要不调试时会把界面卡住,又引起这个android以为应用已停的错误。真是不方便啊。