1.设置NDK目录 在“Android”配置项上设置下“NDK”,选择NDK后,有一个选项“NDK Location”,这里配置NDK根目录。如下图:
2.添加NDK支持
Android项目上右键,选择“Android Tools”再添加Native的支持。
如果不需要调试,这时编译环境已经OK了
3.修改编译命令
,在C++ Build中设置Build command,把Use default选项去掉,在ndk-build后面添加参数NDK_DEBUG=1,使得编译出的SO带源码等调试信息。 如下图:
开发、编译、调试环境到这里算是OK了。调试具体的操作继续看下面。
4.解决 Unknown Application ABI
添加 Application.mk,内容如下
APP_PLATFORM := android-14
版本号对应的是 android:minSdkVersion="14"
5.解决No Symbol table is loaded
整个编译运行没问题的前提下,在C\C++代码中加断点,运行时不能断住,加断点时日志提示“No symbol table is loaded.
测试用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中调用它。
吐槽:
调试是否能用,竟然跟代码有关,Google里的大神们,您这NDK都到r10了,还这个样子啊
顺便吐槽下ADT的界面开发功能,创建的资源竟然还需要手工关联代码,比15年前的VC6还不如啊,一种回到解放前的赶脚。不知道Google抛弃Eclipse后,自己搞的开发环境是否会好点,希望Google能从MS或者Borland挖几个人过来啊。
参考
http://qiang106.iteye.com/blog/1830416
http://blog.sina.com.cn/s/blog_44702ec60102venm.html
http://blog.csdn.net/s_xing/article/details/18351307