热搜: Loading  安卓开发  Android  ios  ShareSDK  开源  Python  生命周期  新手  RecyclerView 
  • 首 页
  •  
     
    当前位置: 首页 » 移动开发 » Android开发 » 正文

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

    放大字体  缩小字体 发布日期:2017-02-05  浏览次数:298
    核心提示:前言新的一年,大家新年快乐~~鸡年大吉!本次给大家带来何老师的最新文章~虽然何老师还在过节,但依然放心不下广大开发者,在此佳节还未结束之际,给大家带来最新的技术分享~ 事件的起因不说了,总之是需要实现一个 NDK 层的网络请求。为了多端适用,还是选择

    前言

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

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

    事件的起因不说了,总之是需要实现一个 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 NDK 层发起 HTTP 请求的问题及解决”相关文章

    WebComponents-面向未来的组件标准
    对于前端开发者而言,W3C组织制定的HTML标准以及浏览器厂商的实现都是“鱼”而 不是“渔”,开发者在需求无法满足的情况下通过现有技术创造了各种组件,虽然短期满足了需求但是由于严重缺乏标准,导致同一个组件有成千上万的相似实现但 它们却无法相互重用,这很大程度上制约了组件化的最大价值-重用,Web Components则在组件标准化方面向前迈了一大步。

    Android下拉刷新完全解析,教你如何一分钟实现下
    以下是我自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下。相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能

    android 横竖屏限制的配置方法
    android 横竖屏限制的配置方法,需要的朋友可以参考一下

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

    Android网络请求库android-async-http介绍
    这篇文章主要介绍了Android网络请求库android-async-http介绍,本文讲解了android-async-http的概念、特征以及使用实例,需要的朋友可以参考下

     
    TAGS: HTTP 安卓开发
     
     
    猜你想看
     
    更多..
    与本文有关HTTP
    • Android项目框架升级尝鲜OkHttp
      本文来自http://blog.csdn.net/liuxian13183/,引用必须注明出处!随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了。先简单介绍下,本项目最初使用loop4j(即async-http)框架,仅98kb大小,使用也比较方便,为什么要选用它呢?13年的时候其他
      12-23 关键词:OkHttp安卓开发
    • android 搭建https Server
      android 搭建https Server
      在android上采用http协议的服务器,需求有点奇葩,非要用https更是醉了。这里只要求单向https认证,不要双向认证。 本文采用的开源框架Nanohttpd( https://github.com/NanoHttpd/nanohttpd ) ,在release页面下载jar包本地进行导入. Nano的使用比较简单,集成N
      12-06 关键词:Https安卓开发
    • http协议Authorization认证方式在Android开发中的使用
      http协议Authorization认证方式在Android开发中
      我们都知道,http协议是一种无状态协议,在Web开发中,由于Session和Cookie的使用,使得服务端可以知道客户端的连接状态,即用户只需要在浏览器上登录一次,只要浏览器没有关闭,后续所有的请求服务端都会知道这个请求是谁发来的。但是在移动端开发的过程中,
      11-13 关键词:HTTP安卓开发
    • 安卓开发实战之app之版本更新(DownloadManager和http下载)完整实现
      安卓开发实战之app之版本更新(DownloadManager
      本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取 一种是打开应用之后提醒用户更新升级而更新操作一般是在用户点击了升级按钮之后开始执行的,这里的升级操作也分为两种形式: 一般升级 强制升级app升
      09-29 关键词:安卓开发HTTP
    • 学会正确的使用 https,不要留下漏洞!!
      学会正确的使用 https,不要留下漏洞!!
      很多文章对客户端https的使用都是很模糊的,不但如此,有些开发者直接从网上拷贝一些使用https的“漏洞”代码,无形之中让客户端处在一种高风险的情况下。 今天我们就对有关https使用的问题进行深入的探讨,希望能解决以往的困惑。对于https,需要了解其工作
      09-24 关键词:Https安卓开发
    • RESTful Android 网络层解决方案(一):概览与认证实现方案
      RESTful Android 网络层解决方案(一):概览与
      在拆轮子系列:拆 Okio 最后我曾说过会对 Retrofit、OkHttp、Okio 三者进行一个小结,并且整理一套网络层的“微架构”,今天终于得以完成,在这里一起奉送给大家 :):checkered_flag: RESTful 安卓网络层解决方案(一):概览与认证实现方案RESTful 安卓网络层
      09-08 关键词:RESTOkHttp
    • Android 探索之 HttpURLConnection 网络请求
      前言:最近一直想着学习一下比较好的开源网络框架okhttp,想着学习之前还是先总结一下Android原生提供的网络请求。之前一直在使用HttpClient,但是android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类).所以我们今天主要总结HttpURLConnection
      08-30 关键词:HttpComponents安卓开发
    • [原]基于 HTTP/2 的 APNs 协议:Universal Push Notification Client SSL 证书
      [原]基于 HTTP/2 的 APNs 协议:Universal Push
      前久生产用的 Push 证书过期,于是重新制作了证书放到服务器上。原本以为这就 OK 了。但今天测试时发现,在仿真服务器上的沙盒证书不能用了!(用 APN Tester Free 测试)。google 了一下发现:2015年12月17日起,发布 “基于 HTTP/2 的全新 APNs 协议”,新
      08-30 关键词:NotificationSSL协议
    • Android HttpClient GET或者POST请求基本使用方
      在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.这里只介绍如何使用HttpClient发起GET或者POST请求
      09-05 关键词:HttpClientPOST请求
    • Android中发送Http请求(包括文件上传、servlet
      首先我是写了个java工程测试发送post请求:可以包含文本参数和文件参数
      08-18 关键词:Http文件上传servlet
     
    相关评论
     
    猜你喜欢
     
    网站首页 | 关于我们 | 联系方式 | 使用协议 | 版权隐私 | 网站地图 | 网站留言