搭建起 Android 的开发环境多时了,项目却没有亲自动手写几个,这几天想深入了解下 native 层和 Java 层的相互操作,于是需要把现有的环境升级一下,也能搞 NDK 的开发。
之前也曾提到过,因为 T61 突然罢工,现在的设备是一台较老的 MBP,和 OS X 并列安装了一份 Windows 7 的 64 位版。而 Android 的开发环境,是从原来的 T61 上复制过来的,是个 32 位的版本。复制的时候,并没有把之前 NDK 所依赖的 Cygwin 环境备妥,反倒是顺手把 NDK 给删除了,所以现在需要重新下载。新下载的版本比较新,直接把压缩包展开到了 eclipse 的顶级目录下。根据网上文章里的说法,新版本的 NDK 已经可以不依赖于其他组件就能工作了,只是要到 eclipse 的 Preferences 里配置一下路径。
打开 eclipse 的设置界面,左找右找没有找到别人的截图里显示的清清楚楚的 NDK 那一项,实在困惑。难道我有什么组件不是最新的?第一反应就是执行更新操作。不管相不相关,先把 Android SDK 全部更新了一遍,然后开始更新 eclipse IDE 环境,结果出了个错误:
Connection to https://dl-ssl.google.com refused.
这个错误非常不应该,因为 Android SDK 的更新其实也会连到这个站,但并没有返回任何错误。接下来发现有人说到一个叫 NDK Plugin 的组件,这下触动了我,因为我不记得我曾经安装过这个组件。结果要安装它的话,发现它应该是 ADT 的一个子组件,要查看或者更新 ADT,就又走到前面的错误信息上去了。
到网上查询,有两类情况,一是这个错误发生在 SDK 更新的时候,显然和我遇到的情形不一样,二是有人建议把 https 改成 http 再试就成功了,但我试过也没有效果,只是错误提示变了,没太记清楚,好像是说站点上没有这个组件(也许说的是仓库)的信息。还有几个帖子或者文章指出 URL 的最后必须以 / 结尾,有的则宣称把 site 删除再添加就会好,尽皆无效,看来还是要走 https 那条路。因为伟大的墙的原因,dl-ssl.google.com 这个域名是我在 hosts 文件里指明了 IP 的,考虑到 google 很多服务都有不止一个 IP,所以我决定换一个 IP。换了之后再次尝试,返回的错误是证书中的域名不符。在这里调整了多次,上述的几个错误信息又交替出现多次,也没解决。到最后把牙一咬,冒着流量超出的扣费风险,把 hosts 里的 IP 指定全部注释掉,连上了 AWS 上的 VPN。这次一下就出现了曙光,我在更新列表里看到了 NDK Plugin 的字样。可接下来的事情仍然比较郁闷,总是提示更新失败,继续根据蛛丝马迹追索,发现有人说去掉“Contact all update sites during install to find reqired software”的勾选就好了。照做,还是不行,会提示发生了错误,给你三种选择(根据记忆,不一定准确):一是保持 eclipse 的状态不变,对将要安装的组件做一些调整;二是调整 eclipse 适应组件的要求;三是你自己想个办法。逐一试过,也都无效,但是在选第三种的时候,发现了一条比较详细的描述:
(com.android.ide.eclipse.ndk.feature.group 22.3.0.v201310242005-887826) requires ‘org.eclipse.cdt.feature.group 0.0.0’ but it could not be found
。
所有的信息瞬间融会贯通:NDK Plugin 是需要 CDT 组件的!由于我去掉了上文提到的那个勾选,eclipse 不会自动安装 CDT,所以会报出找不到 CDT 的信息;那我没有去掉勾选的时候问什么也不行呢,其原因是,我没有设置 CDT 组件的下载源!于是打开 eclipse 的配置界面,在 Install/Update -> Avaliable Software Sites 里新增了 CDT – http://download.eclipse.org/tools/cdt/releases/kepler 的信息(搜出来的 URL,根据我的 eclipse 版本把最后一级从 juno 改成了 kepler)。再次尝试安装 NDK Plugin 就顺利完成了。
需要反省的是,后来发现,当初在做那个去掉“Contact all update sites during install to find reqired software”的勾选的操作时,对错误信息的判读没有深入,当时给出的信息类似于
session context was:(profile=epp.package.jee, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).
No repository found containing: osgi.bundle,org.eclipse.cdt,8…
里面已经出现了 CDT 的字样,疏忽了。