【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

使用 Swift 为 Android 构建代码

  • 2016-04-26
  • 本文字数:1879 字

    阅读完需:约 6 分钟

一个名为“Port to Android”的合并请求最近被合并进了官方Swift 代码仓库的主分支,这使得用Swift 开发简单的Android 程序变得有可能。该合并请求为Swift stdlib 增加了安卓目标,其允许开发者使用Linux 环境,跨平台地为基于ARMv7 处理器的Android 进行编译。

Swift 面向 Android 的端口主要是两个开发者的贡献:一个是 Zhuowei Zhang,他在 2015 年末开始了此项目,另一个是Facebook 的Brian Gesiak,他提交了此次PR,并解决了在最终被合并到主分支之前出现的所有反馈的问题。由于这次PR 的规模很大(最初包含了54 个文件的修改),整个流程从提交到合并花了差不多两个月时间。

正如之前提到的,目前只有可能在Linux 环境跨平台编译Android 。另外还需要最新版本的Android NDK,以及为Android 开发的libiconv 和libicu。这些依赖项都满足之后,针对Android 的Swift 可以通过这样的调用被构建:

复制代码
$ utils/build-script \
-R \ # Build in ReleaseAssert mode.
-T \ # Run all tests.
--android \ # Build for Android.
--android-deploy-device-path /data/local/tmp \ # Temporary directory on the device where Android tests are run.
--android-ndk ~/android-ndk-r10e \ # Path to an Android NDK.
--android-ndk-version 21 \
--android-icu-uc ~/libicu-android/armeabi-v7a/libicuuc.so \
--android-icu-uc-include ~/libicu-android/armeabi-v7a/icu/source/common \
--android-icu-i18n ~/libicu-android/armeabi-v7a/libicui18n.so \
--android-icu-i18n-include
~/libicu-android/armeabi-v7a/icu/source/i18n/

一旦编译器可用,它可以被用作创建 Android 可执行文件:

复制代码
$ build/Ninja/ReleaseAssert/swift-linux-x86_64/swiftc \ # The Swift compiler built in the previous step.
-target armv7-none-linux-androideabi \ # Targeting android-armv7.
-sdk ~/android-ndk-r11c/platforms/android-21/arch-arm \ # Use the same NDK path and API version as you used to build the stdlib in the previous step.
-L ~/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \ # Link the Android NDK's libc++ and libgcc.
-L ~/android-ndk-r11c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9 \
hello.swift

它可以和 Swift stdlib 以及 Android NDK libc++ 一起被部署到真实的 Android 设备上,使用下面的 adb push 命令:

复制代码
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftCore.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftGlibc.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftOnoneSupport.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftRemoteMirror.so /data/local/tmp
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftExperimental.so /data/local/tmp
$ adb push ~/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
$ adb push hello /data/local/tmp

最后,该程序可以使用 adb shell 命令执行。

因为目前此端口只包含 Swift stdlib,还需要做很多工作才能让 Swift 有效地被用作创建完整的安卓应用,比方说提供图形化用户界面的应用。它可以用两种方式来完成,要么用某些可以运行在 Android 上的 Swift UI 框架,或者通过和 Android 的 Java 框架交互。然而,要注意的是,Swift 编译器目前并没有包含任何条款,能够让 Swift 像和 Objective C 代码互通一样,和 Java 代码更简单地互通。

另一个在真实 Android 应用中使用 Swift 代码的可能是,使用 JNI/ NDK 通过 Java 调用 Swift 代码。Zhang 还提供了一个原型应用示例来展示如何在JNI 之上从Android Java 应用访问Swift 代码。

查看英文原文 Using Swift to Build Code for Android


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-26 19:004676

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day84

穿过生命散发芬芳

网络攻防 7月日更

过去几个月里面的几家大厂(美团、字节、腾讯、阿里)均拿到 offer,最终去了字节跳动

Java 编程 程序员 架构 面试

模块三作业

A先生

Spring之 EL表达式

邱学喆

语法规则 Expression ExpressionParser ParserContext EvaluationContext

细说节流(Throttle)和防抖(Debounce)

devpoint

防抖 节流 7月日更

程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

AI乔治

Java spring 架构 微服务 springboot

近几天fil价格暴跌:fil还有希望吗?

区块链 分布式存储 IPFS fil fil行情

深入浅出 Java 泛型,一文搞定

猴哥一一 cium

Java 翻译 泛型

一文读懂区块链技术如何改变非洲贸易(下)

CECBC

使用Apache Spark构建可靠的数据湖(九)

数据与智能

spark Data Lake iceberg Hudi

强强联手:2021强网杯LongTimeAgo复盘分析

网络安全学海

网络安全 信息安全 渗透测试 漏洞扫描 强网杯

AI解锁无人时代 仍需数据安全保驾护航

CECBC

Vue进阶(四):使用 Vuex + axios 发送请求

No Silver Bullet

Vue axios vuex 7月日更 vue-resources

Python 正则表达式急速入门

喵叔

7月日更

不要让这2个坏习惯限制了你的成长

俞凡

认知

Docker的学习体验

DisonTangor

,docker

kubernetes/k8s CSI分析-容器存储接口分析

良凯尔

Kubernetes 源码分析 CSI Kubernetes Plugin #Kubernetes#

Vue进阶(七十八):Vue 定时器与 JS 定时器

No Silver Bullet

Vue 定时器 7月日更

完整视频+源码!十六天带你精通基于Spring Cloud微服务电商项目

Java架构追梦

Java 架构 面试 微服务 SpringCloud

大三就拿到字节提前批,你不想成长,生活总会逼着你成长

Java架构师迁哥

阿里大牛把电商购物、电商秒杀、12306抢票、淘宝天猫各种活动的系统架构层面全部记载到这份《高并发系统架构》手册里了

Java 编程 架构 计算机

2021年WEB全栈开发技术栈

devpoint

Vue 全栈 7月日更

Python OpenCV 图像的二值化操作再次学习与图像平滑处理(卷积处理)

梦想橡皮擦

Python 7月日更

如何与同事相处

escray

学习 极客时间 朱赟的技术管理课 7月日更

去阿里应聘P7Java岗,都会被问到哪些问题?

Java架构师迁哥

通证与区块链:前台经济+后台技术

CECBC

做大做强肉牛产业,生物资产解决方案助力乡村振兴

CECBC

Apache Druid 安装的时候进行 Java 版本校验没有输出

HoneyMoose

从家里到阿里,学弟求职的一年

程序员鱼皮

Java 数据库 redis 面试 求职

Java为什么用迭代器

卢卡多多

7月日更

Redis - 配置文件

旺仔大菜包

redis

使用Swift为Android构建代码_移动_Sergio De Simone_InfoQ精选文章