在 Android 上使用网络
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《在 Android 上使用网络》,涉及到,有需要的可以收藏一下
我一直在尝试让 go 应用程序在 android 10 上运行,但遇到了障碍。我很确定我现在知道为什么会遇到这个障碍,但不知道如何解决它。首先,交叉编译是简单的事情。例如,
package main import "fmt" func main() { fmt.println("hello, android!") }
使用 goarm=arm64 goos=linux go build
编译后可以正常运行
但是现在如果我添加一些网络代码:
package main import ( "fmt" "net/http" "io/ioutil" ) func main() { fmt.println("hello, android!") client := &http.client{} resp, err := client.get("https://www.google.com") if err != nil { fmt.println(err) return } bodybytes, err := ioutil.readall(resp.body) if err != nil { fmt.println(err) return } fmt.printf("%s", bodybytes) }
并以与运行相同的方式进行编译,但我会收到如下错误:
get "https://www.google.com": dial tcp: lookup www.google.com on [::1]:53: read udp [::1]:47618->[::1]:53: read: connection refused
最初我以为这是我的 android 设备上的一些网络配置,但经过大量的尝试后,我很确定它与 android 网络“不同”这一事实有关。也许这是仿生与 libc 的问题(?),但至少还有其他人似乎遇到了同样的障碍,并通过使用 ndk 附带的工具链进行构建来解决。
有人知道如何真正让它发挥作用吗?
最初我希望它像 goos=android goarch=arm64 go build
一样简单,但失败了:
# command-line-arguments /usr/lib/golang/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 /usr/bin/ld: /tmp/go-link-384615804/go.o: relocations in generic elf (em: 183) <bunch of these> /usr/bin/ld: /tmp/go-link-384615804/go.o: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status
一些谷歌搜索出现了 https://github.com/golang/go/issues/30216 - 这表明你需要显式启用 cgo。但是 goarch=arm64 goos=android cgo_enabled=1 go build
仍然失败,这次是:
# runtime/cgo gcc_android.c:6:10: fatal error: android/log.h: no such file or directory 6 | #include <android/log.h> | ^~~~~~~~~~~~~~~ compilation terminated.
我尝试了很多其他组合,最接近的是在我的 ndk 安装中指向 go 编译器。基本上类似于 goarch=arm64 goos=android cc=$ndkroot/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc cgo_enabled=1 cgo_cflags="--sysroot $ndkroot /sysroot -i$ndkroot/sysroot/usr/include/arm-linux-androideabi/" 转到 build
。但这失败了:
# runtime/cgo In file included from _cgo_export.c:4:0: cgo-gcc-export-header-prolog:25:14: error: size of array '_check_for_64_bit_pointer_matching_GoInt' is negative
我指向编译器的方式有问题 - 例如,如果不指定 sysroot,我将找不到任何头文件 (stdlib.h),即使如此,它也不会找到特定于体系结构的包含文件 (asm /types.h) 而不指定附加包含路径。因此,该错误可能是体系结构和编译器之间的不匹配,我只是不确定在哪里或如何修复它。
如果您已阅读所有内容,谢谢!一些附加信息:
- go 版本:1.14.13 linux/amd64
- ndk 版本:r16b
我也研究过像 gomobile 这样的东西,但它似乎更适合构建 android 应用程序(如 apk),尽管我可能在这里遗漏了一些东西。
解决方案
想通了!好吧,我的具体示例可以正常工作,但我不太确定为什么会这样。答案基本上来自 https://github.com/golang/go/issues/20755,你必须:
- 构建独立版本的 ndk(执行此操作的 python 脚本中的注释表示它以更方便的方式将其打包以供其他工具使用)
- 使用 ndk 中的交叉编译器重建 go 的标准库
- 使用 ndk 交叉编译器构建您的应用程序。
对于我的例子:
$ $(NDKROOT)/build/tools/make_standalone_toolchain.py --arch arm64 --api 24 --install-dir $(HOME)/ndk_standalone $ CC=$(HOME)/ndk_standalone/bin/clang CXX=$(HOME)/ndk_standalone/bin/clang GOOS=android GOARCH=arm64 go install std $ CC=$(HOME)/ndk_standalone/bin/clang CXX=$(HOME)/ndk_standalone/bin/clang GOOS=android GOARCH=arm64 CGO_ENABLED=1 go build
网络工作正常!
我不太确定为什么(或者是否)clang 与直接调用编译器不同。也许我会多玩玩这个。另外,在编译我的应用程序时,我仍然必须显式启用 cgo(但不适用于 go std 库),否则链接失败。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

- 上一篇
- WIN7不能打开exe文件的处理方法

- 下一篇
- 特斯拉全系车型降价,裁员计划同步进行
-
- Golang · Go问答 | 1年前 |
- 在读取缓冲通道中的内容之前退出
- 139浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 戈兰岛的全球 GOPRIVATE 设置
- 204浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将结构作为参数传递给 xml-rpc
- 325浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何用golang获得小数点以下两位长度?
- 477浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何通过 client-go 和 golang 检索 Kubernetes 指标
- 486浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将多个“参数”映射到单个可变参数的习惯用法
- 439浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 将 HTTP 响应正文写入文件后出现 EOF 错误
- 357浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 结构中映射的匿名列表的“复合文字中缺少类型”
- 352浏览 收藏
-
- Golang · Go问答 | 1年前 |
- NATS Jetstream 的性能
- 101浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何将复杂的字符串输入转换为mapstring?
- 440浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 相当于GoLang中Java将Object作为方法参数传递
- 212浏览 收藏
-
- Golang · Go问答 | 1年前 |
- 如何确保所有 goroutine 在没有 time.Sleep 的情况下终止?
- 143浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 62次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 84次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 90次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 83次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 85次使用
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- Golang取得代码运行时间的问题
- 2023-02-24 501浏览
-
- 请问 go 代码如何实现在代码改动后不需要Ctrl+c,然后重新 go run *.go 文件?
- 2023-01-08 501浏览
-
- 如何从同一个 io.Reader 读取多次
- 2023-04-11 501浏览