1.引子
关于windows系统下eclipse开发NDK,网上有很多文章,但都大都需要安装配置cygwin。但也有文章说可以免cygwin,如以下文章:http://blog.csdn.net/codezjx/article/details/8879670。众说纷纭,让人很是迷惑。于是决定对此做一番研究。
2.官方文档
2.1 ndk-build
最权威的说法莫过于官方文档。通过查阅NDK的更新历史https://developer.android.com/intl/zh-cn/ndk/downloads/revision_history.html(当前的NDK版本为Android NDK, Revision 10d (December 2014)
),发现在Android NDK, Revision 7 (November 2011)
部分有如下说明:
可见从该版本开始,NDK已经开始对不使用cygwin做出尝试,虽然只是实验性的。方法就是在cmd命令行中调用ndk-build.cmd。但其中也提到,ndk-gdb是无法在windows下运行的,所以如果想调试的话,仍然需要cygwin。
查看之后的NDK各版本更新,可以看到修复了很多ndk-build.cmd的bug,可以任务,它的功能逐渐从实验版发展到了可以用于工程开发的阶段。
2.2 ndk-gdb
ndk-build可以摆脱cygwin了,那ndk-gdb呢?接着看官方文档https://developer.android.com/intl/zh-cn/ndk/guides/ndk-gdb.html,其中介绍了ndk-gdb的使用。有如下一段:
可见在windows系统下,可以使用cygwin,也可以使用实验性的python实现版本,ndk-gdb-py命令
一下是NDK的安装目录结构
从中可以看到ndk-gdb-py.cmd和ndk-gdb.py两个文件。ndk-gdb-py.cmd命令通过调用ndk-gdb.py实现调试的功能。但我们可以看到,文档在也说的很清楚,目前还只是一个实验性的版本。也许像ndk-build一样,经过很多版本之后,相应的bug得到修复,ndk-gdb应该也能够摆脱cygwin
2.3 其它
其实为了完全的摆脱cygwin,NDK也在windows下实现了一些常用的linux命令,如下
3.编译方法
既然目前的NDK可以实现无cygwin的编译,那么总结一下目前可用的编译方法,大致就包括如下几种:
3.1 在cygwin中用命令行编译
进入工程的根目录,执行$ANDROID_NDK/ndk-build
命令,$ANDROID_NDK
环境变量为NDK的安装目录
此命令调用的是NDK根目录下的ndk-build shell脚本,cygwin用模拟unix shell的方式解释执行
其中会检查make的版本是否为cygwin兼容的make:
所以,这种情况下使用的是cygwin里安装的make。
3.2 在eclipse中使用cygwin编译
如果觉得敲命令不够方便,可以在eclipse中配置,让其自动执行。
- 安装CDT后,右击工程选择properties选项,依次选择builders,New…,Program,OK
填写Name,Location和Arguments,Location为cygwin shell的路径,而Arguments就是模拟了方法一中的命令
--login -c "cd /cygdrive/f/WorkSpace/NativeDemo && $ANDROID_NDK/ndk-build"
。
配置完成后,回到Properties对话框,将新创建的Cygwin-Builder放在第一的位置,不要选择自带的CDT Builder,如下图:
然后就可以进行编译了
3.3 在eclipse中使用ndk-build.cmd编译
类似于3.2,新建一个Program,按如下配置
其中Location即为NDK根目录下的ndk-build.cmd位置,Working Directory为工程根目录,其中使用了eclipse的环境变量${workspace_loc}(其它环境变量可以点击Variables…查看)。同样的,将该builder放在第一的位置:
注:这种方法其实就完全摆脱了cygwin的限制,因为使用的是ndk-build的windows版本,ndk-build.cmd
3.4 使用CDT自带builer进行编译
在builder中选中CDT Builder:
在C/C++ Build可以看到,默认的命令Build Command就是ndk-build,其实类似于3.3,执行的就是ndk-build.cmd
也可以修改为ndk-build.cmd所在的路径
大家可能会注意到,在C/C++ Build的Tool Chain Editor中有对Current toolchain和Current builder的设置。
其实如果像上边那样设置了默认的命令Build Command为ndk-build之后,这两个选项都是不起作用的。因为此时使用的gcc是根据工程设置,调用的NDK中对应的gcc,而make则使用了NDK中自带的windows实现
如下图所示,这是ndk-build.cmd的内容,可见,使用的NDK自带的make:
3.5 参考文章:
Eclipse自动编译NDK/JNI的三种方法
http://www.cnblogs.com/skyseraph/p/3979238.html
4 关于断点调试
按如上的3.3,3.4设置之后,其实就可以通过如下方式进行调试了
注意事项
- 调试之前,先将应用烧入测试机或模拟器
- 有的文章说,调试时要在3.4所示的Build Command中,ndk-build后加上参数,NDK-DEBUG=1,但我测试的在不加的情况下也可以调试
调试时需要在工程的AndroidManifest.xml中添加应用的
android:debuggable="true"
,如果出现了Avoid hardcoding the debug mode
的问题,或者出现了其他的问题,都可以参考我的上一遍文章,《用eclipse实现NDK调试常见问题总结》http://blog.csdn.net/ytzys/article/details/47341671调试时很关键的一点就是,必须在jni目录下建立Application.mk,并在其中写入
APP_PLATFORM := android-8
,否则无法debug,会报Unknown Application ABI: Unable to detect application ABI's
的错误。在Debug的配置中可以看到如下内容,其中Debugger使用的${NdkGdb},该变量的值不太清楚,推测使用就是python版本的ndk-gdb,ndk-gdb.py