在 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)/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| ^~~~~~~~~~~~~~~ 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次学习
-
- 协启动
- SEO摘要协启动(XieQiDong Chatbot)是由深圳协启动传媒有限公司运营的AI智能服务平台,提供多模型支持的对话服务、文档处理和图像生成工具,旨在提升用户内容创作与信息处理效率。平台支持订阅制付费,适合个人及企业用户,满足日常聊天、文案生成、学习辅助等需求。
- 9次使用
-
- Brev AI
- 探索Brev AI,一个无需注册即可免费使用的AI音乐创作平台,提供多功能工具如音乐生成、去人声、歌词创作等,适用于内容创作、商业配乐和个人创作,满足您的音乐需求。
- 9次使用
-
- AI音乐实验室
- AI音乐实验室(https://www.aimusiclab.cn/)是一款专注于AI音乐创作的平台,提供从作曲到分轨的全流程工具,降低音乐创作门槛。免费与付费结合,适用于音乐爱好者、独立音乐人及内容创作者,助力提升创作效率。
- 9次使用
-
- PixPro
- SEO摘要PixPro是一款专注于网页端AI图像处理的平台,提供高效、多功能的图像处理解决方案。通过AI擦除、扩图、抠图、裁切和压缩等功能,PixPro帮助开发者和企业实现“上传即处理”的智能化升级,适用于电商、社交媒体等高频图像处理场景。了解更多PixPro的核心功能和应用案例,提升您的图像处理效率。
- 9次使用
-
- EasyMusic
- EasyMusic.ai是一款面向全场景音乐创作需求的AI音乐生成平台,提供“零门槛创作 专业级输出”的服务。无论你是内容创作者、音乐人、游戏开发者还是教育工作者,都能通过EasyMusic.ai快速生成高品质音乐,满足短视频、游戏、广告、教育等多元需求。平台支持一键生成与深度定制,积累了超10万创作者,生成超100万首音乐作品,用户满意度达99%。
- 12次使用
-
- 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浏览