Android NDK 开发之 HTTP 请求的问题及解决
白羽 2018-06-07 来源 :网络 阅读 2299 评论 0

摘要:本文将带你了解Android NDK 层发起 HTTP 请求的问题及解决,需要实现一个 NDK 层的网络请求。为了多端适用,还是选择了 CodeTyphon 作为跨平台方案。希望本文对大家学Android有所帮助


需要实现一个 NDK 层的网络请求。为了多端适用,还是选择了 CodeTyphon 作为跨平台方案。


CodeTyphon 自带的 fcl-web 库可以直接完成对于 HTTP 请求的支持,虽然我很想这么说... 在实际使用中,的确可以通过引入  fcl-web 来完成跨平台的网络请求,然而在 Android 端实际测试时,却发生了奇怪的错误。


比如说请求我自己的服务器 www.raxxxx。com ,会发生以下错误:

而当我换用 IP 地址来请求时,却是可以成功的。

输入的域名是实际存在的,可以排除掉域名本身的问题。而使用 adb shell 连入设备,并使用  ping 命令访问该域名,也是正常的。

那么问题可能就出在,找不到 nameserver 。我们都知道,在 Linux 下, nameserver 由  resolv.conf 决定,这个文件通常保存在  /etc 下。于是看了一下,Android 里并没有这个文件,应该就是这个原因引起的了,因为读不到  resolv.conf 所以才导致了无法解释域名。接下来就是去找 Android 下,原本该是  resolv.conf 的东西保存在哪里。

不卖关子了,其实 Android 很早就把 resolv.conf 的内容改成了 key-value 的形式,采用 SystemProperties 进行存储,而其关键的 key 是  net.dns1 和  net.dns2 。

尝试使用 adb 连接手机,并对以上两个 key 进行取值:

 Android NDK 开发之 HTTP 请求的问题及解决

我的手机上取出来的是 OpenDNS 的值,自己设置过。好了,既然已经知道了 nameserver 的所在,接下去就是修改代码以使程序识别和加载。

在 CodeTyphon 中,有一个基础库文件叫 netdb.pp ,其中包含了  resolveName 方法,其具体代码如下:

 Android NDK 开发之 HTTP 请求的问题及解决

其实这段代码很明确,关键变量是 DNSServers ,打印一下看看是个什么值:

程序执行后打出来 -1 ,也就是说在 Android 下,由于  DNSServers 变量中没有任何的数据,导致了完全无法解析域名,在其他平台下,在此处打日志均显示  0 ,表示在这个数组里有一个下标为 0 的数据。

那事情就变得简单了,我们可以直接去找加载了 DNSServers 的地方,很容易的,找到了  InitResolver 函数,由于该函数比较长,此处只截取加载  DNSServer 的部分:

 Android NDK 开发之 HTTP 请求的问题及解决

没有比这更明确的了,就是去找有没有 /etc/resolv.conf 嘛,找到就加载,没找到那就啥都不做了,而刚才说过了 Android 端并没有这么一个文件,于是直接就导致了  nameserver 缺失,间接引起域名无法解析。

好了,那么简易的解决方案也就有了,只需要重建 GetDNsservers 函数,使其能够适应 Android 端的情况即可。

下面给出代码:

 Android NDK 开发之 HTTP 请求的问题及解决

里面还有一个关键代码,是 GetNetDNS ,它用于从 Android 内读取  net.dns1 变量:

 Android NDK 开发之 HTTP 请求的问题及解决

最后,把上面的 InitResolver 改一下,使其可以正常加载工作于 Android 端的这段代码:

 Android NDK 开发之 HTTP 请求的问题及解决

编译运行程序, Error resolving host 的问题即得到了解决。

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程