关于NDK调试的文章,在网上能搜到几篇写得很好的。大概看了下,觉得应该不会太难。但真正能java和c混合调试,足足花了我一天的时间。一开始实在是太大意。整个过程下来,要求每一步都不能出错,不然就是折腾。所以我想站在别人的肩上,再把整个过程描述一下。本文的末尾或给出参考文章的链接。整个过程还是蛮复杂,不要烦躁哦,亲!
1.使用的软件版本
Ubuntu: 10.04
Eclipse: 4.3.0
NDK: r8
2.环境搭建
NDK的安装这里就不赘述,免得喧宾夺主了。只介绍下CDT和sequoyah两个插件的安装。
(1)安装CDT
给eclipse安装一个CDT,eclipse>help>install new software
下载地址为 http://download.eclipse.org/tools/cdt/releases/indigo/ (全部选上安装就行了)

(2)sequoyah
安装sequoyah 地址为 http://download.eclipse.org/sequoyah/updates/2.0/
只需要安装Sequoyah Android Native Code Support 一项就可以了
3.代码编译
到这一步,整个环境都搭好了。我们开始上主菜吧。
(1)如下导入NDK提供的例子HelloJni。如果导入错误,就先把错误解决了吧。
(2)把当前项目转为C++项目,File->new->other,如下选择 Convert to a C/C++ Project...
如下图,进行设置
PS:会出现找不到头文件jni.h的错误
解决方法:
Project Properties -> C/C++ General -> Path and Symbols
选择include标签,Add -> $Android_NDK_HOME/platforms/android-14/arch-arm/usr/include
且选中All languages.
最后Apply -> OK
(3)进行编译配置,把build command设置为ndk下ndk-build的完整路径(我已经把NDK的路径加到PATH中,所以不需要加路径,下面用到NDK的命令我都没加命令)
Project->Properties
将Behavior选项页下的build处的all替换为空格
(4)现在可以编译JNI代码,直接执行Build Project
4.代码调试
编译完成后,接下来我们看看怎么调试。
(1)首先,在NDK目录下找到ndk-gdb,把ndk-gdb最后一行注释掉
然后,进入到工程目录,执行命令ndk-gdb
出错了,设备或模拟器上安装的版本不是可调试的,需要重新安装可调式版本
解决方法:
首先确认我们现在的版本是不是可调试版本,如下打开文件AndroidManifest.xml,查看选项Debuggable是否为true,不是的话选为true,保存,再重新编译,并安装到设备或模拟器就解决问题了。
(2)再次执行ndk-gdb,没任何打印说明执行成功,另外你会发现obj文件下多了一些文件
(3)开始调试配置
如下图,右击C/C++ Application,选择new
这是一个独立的配置项,所以名字主要不跟Android Application下的配置项一样就行了。接下来按下图进行配置
其中文件app_process就是刚刚执行ndk-gdb生成的,Project的名字一定要一样,有时候点Browse没有任何选项的话,可以自己填进去,这个可能跟刷新有关,发现eclipse在ubuntu上刷新很慢。
接下来点击 Select other... ,按下图进行配置
上图确定后,点击Apply先保存Main选项的内容,然后切换到Debuuger选项,如下图进行配置
其中,
Stop on startup at:Java_com_example_hellojni_HelloJni_stringFromJNI(入口,意义不大,由断点决定)
GDB debugger:/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb
GDB command file:/allwinner/android-ndk-r8e/samples/hello-jni/obj/local/armeabi/gdb2.setup
gdb.setup是和app_process同时生成。那gdb2.setup是怎么回事?复制gdb.setup,命名为gdb2.setup,并删除gdb2.setup文件中的最后一行“target remote :5039”。为什么用gdb2.setup不用gdb.setup呢?那是因为每次调试都会覆盖gdb.setup,不想每次都改,所以换名。就像有人不想每次介绍名字都给人笑,就改名那样,呵呵!
切换到Connection选项
(4)到这里配置就算完成了,接下来可以真正的开始调试了
a. 首先分别在java和jni代码中设置断点,我的如下
b.执行调试,注意Debug As 选择的选项是 Android Application,先运行项目的java调试。程序会再运行到第一个断点处停下来。
这时候赶紧运行在命令行下进入工程目录,然后运行ndk根目录下的ndk-gdb。运行之后是没有任何输出的。
c.找到刚刚配置的那个选项,点击Debug
如果之前每个步骤都正确的话,可以得到如下的画面:(debug模式下)
d.接下来进行单步调试,按F6。并不像我想的那样跳到jni代码那里去。一开始我以为那里弄错了,可是Console里gdb还在运行啊。后来找到Debug中,如下图对应的选项,发现其实已经跳到jni的断点处了,只是没有自动跳转。
到这里,NDK的编译和调试就算是被我们拿下了。
附:
错误1:
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
解决方法:
android-ndk-r8c/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;
错误2:
Invalid attribute name:
package
解决方法:
我会出现这个错误的原因,是因为我的项目是从Windows拷贝到Ubuntu上的,当我用vim打开问题文件的时候,就一目了然了,因为字符编码不同导致的。
参考:
http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html
http://blog.youkuaiyun.com/dfqin/article/details/6901506