关于windows系统下eclipse开发NDK,是否还需要cygwin的问题

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
    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值