被这个问题卡了我3天,终于搞清楚了原因。网上对这个问题也有各种解决方案:有的说需要增加编译参数-g;有的说写个test方法,先调用一下;有的说修改gdb.setup文件,确保是unix回车符。基本都属于胡扯的。
先说说环境:
Windows 7、Eclipse Juno 4.2.2、CDT 8.1.2、ADT 23、NDK r10d、Python 3.4。不要提什么cygwin,NDK r10d已经不需要它了,改用Python了。搞定这些环境真不易啊,还得FQ才行。
错误描述:
整个编译运行没问题的前提下,在C\C++代码中加断点,运行时不能断住,加断点时日志提示“No symbol table is loaded. Use the "file" command.”。
测试用JNI类:
public class MyTest {
static {
System.loadLibrary("jnitest");
}
public static native String test();
}
错误原因:
受NDK里Sample的影响,System.loadLibrary()做成了static,放在了JNI类里。JAVA在调用static块的时机是首次使用该类,也就是首次调用test方法的时候,我的App中,是在一个菜单item中调用的test方法。但是,ndk-gdb是在应用首次运行后,调用gdb.setup设定调试环境的,目前看,仅配置这一次。也就是说ndk-gdb配置调试环境时,JAVA虚拟机还没有loadLibrary,以后又不再进行配置,于是就产生了以上的错误。
解决方法:
将System.loadLibrary("jnitest");封装到一个static方法中,在onCreate中调用它。