分享好友 移动开发首页 频道列表

Android NDK 层发起 HTTP 请求的问题及解决

Android开发  2017-02-05 15:210

前言

新的一年,大家新年快乐~~鸡年大吉!

本次给大家带来何老师的最新文章~虽然何老师还在过节,但依然放心不下广大开发者,在此佳节还未结束之际,给大家带来最新的技术分享~

事件的起因不说了,总之是需要实现一个 NDK 层的网络请求。为了多端适用,还是选择了 CodeTyphon 作为跨平台方案。关于 CodeTyphon 此处不述,感兴趣的可以直接去其官网查看(传送门:http://www.pilotlogic.com/sitejoom/)。

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

比如说请求我自己的服务器 www.rarnu.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
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Android项目框架升级尝鲜OkHttp
本文来自http://blog.csdn.net/liuxian13183/,引用必须注明出处!随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了。先简单介绍下,本项目最初使用loop4j(即async-http)框架,仅98kb大小,使用也比较方便,为什么要选用它呢?13年的时候其他

0评论2016-12-23169

Android 探索之 HttpURLConnection 网络请求
前言:最近一直想着学习一下比较好的开源网络框架okhttp,想着学习之前还是先总结一下Android原生提供的网络请求。之前一直在使用HttpClient,但是android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类).所以我们今天主要总结HttpURLConnection

0评论2016-08-30118

Android HttpClient GET或者POST请求基本使用方法
在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.这里只介绍如何使用HttpClient发起GET或者POST请求

0评论2015-09-0579

Android中发送Http请求(包括文件上传、servlet接收)的实例代码
首先我是写了个java工程测试发送post请求:可以包含文本参数和文件参数

0评论2015-08-18160

Android HttpURLConnection.getResponseCode()错误解决方法
在使用HttpURLConnection.getResponseCode()的时候直接报错是IOException错误,一直想不明白,同一个程序我调用了两次,结果有一个链接一直OK,另一个却一直报这个错误

0评论2015-08-1262

android之HttpPost&HttpGet使用方法介绍
下文直接讲用法,先知道怎么用,再知道怎么回事,具体如下,感兴趣的朋友可以参考下哈

0评论2015-08-09107

怎样实现androidhttp-post方法实例说明
android http-post方法在开发中如何实现,具体代码如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助

0评论2015-07-3157

Android下通过httpClient发送GET和POST请求的实例代码
这篇文章介绍了Android下通过httpClient发送GET和POST请求的实例代码,有需要的朋友可以参考一下

0评论2015-07-2948

Android中HttpURLConnection与HttpClient使用的简单实例
这篇文章介绍了Android 中HttpURLConnection与HttpClient使用的简单实例,有需要的朋友可以参考一下

0评论2015-07-2849

Android封装的http请求实用工具类
提供一个Android封装的http请求实用工具类,在做ANDROID网络开发中这个经常要用到,大家可以参考下面的工具类修改成自己的工具

0评论2015-07-27109

android教程使用webview访问https的url处理sslerror示例
这篇文章主要介绍了android教程使用webview访问https的url处理sslerror示例,大家参考使用吧

0评论2015-07-21149

android平台HttpGet、HttpPost请求实例
出自网络搜索引擎巨头的Android平台,其对网络的支持自然不用多说,在Android SDK中已经集成了Apache的HttpClient模块。使用HttpClient模块,我们就可以使用HTTP协议进行网络连接了

0评论2015-07-1357

Android天气预报之基于HttpGet对象解析天气数据的方法
这篇文章主要介绍了Android天气预报之基于HttpGet对象解析天气数据的方法,非常实用的功能,需要的朋友可以参考下

0评论2015-07-09128

更多推荐