NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

使用 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:004681

评论

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

H2 的全文检索功能

Page

全文检索 lucene H2 内存数据库

游戏夜读 | 数据整理的难题?

game1night

招联金融助力经济复苏 致力成为“智慧生活的消费金融专家”

极客编

Jenkins 插件开发之旅:两天内从 idea 到发布(上篇)

donghui

DevOps jenkins jenkins-plugin

DDD 实践手册(番外篇: 事件风暴-实践)

Joshua

领域驱动设计 DDD 事件风暴 事件驱动 Event Storming

k8s上运行我们的springboot服务之——k8s 1.16.0安装

柠檬

k8s

JVM源码分析之堆内存的初始化

猿灯塔

Flink 从0到1学习 —— 如何使用 Side Output 来分流?

zhisheng

大数据 flink 流计算

那个业务大拿死在了这个地方

小眼睛聊技术

Java 学习 高效工作 程序员 个人成长

《从0到1学习Flink》—— Flink JobManager 高可用性配置

zhisheng

大数据 flink 流计算

Flink 从0到1学习—— Flink 不可以连续 Split(分流)?

zhisheng

大数据 flink 流计算

Deno会在短期内取代Node吗?

葡萄城技术团队

node.js SpreadJS deno

《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

zhisheng

大数据 flink 流计算

奈学教育分享:Hadoop分布式系统HDFS工作原理

奈学教育

hadoop hdfs 分布式

如何参与开源项目

郭旭东

GitHub 开源

如果你想做汽车开发,请先看看这篇。

水滴

自动驾驶 软件开发 开发

聊一聊采访外籍人员时需要注意的几点事项

李冬梅

态度 体验 感悟

你不知道的JSON.stringify(上)

前端黑板报

Java json

《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了?

zhisheng

大数据 flink 流计算

2020年4月云主机性能评测报告

博睿数据

云计算 百度云 ucloud 性能测试 公有云

1分钱秒杀!疫情季,如何为孩子的升学保驾护航?

极客编

露营之美,在乎山水之间也

李冬梅

北大学子手写实现《统计学习方法》书中全部算法!

GitHubDaily

人工智能 GitHub 学习 程序员

k8s上运行我们的springboot服务之——上传服务到docker私服

柠檬

Docker springboot

职场提问的“唐太宗”原则

大伟

Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

zhisheng

大数据 flink 流计算

重学 Java 设计模式:实战工厂方法模式

小傅哥

设计模式 小傅哥 重构 架构设计 工厂模式

Neo4j执行计划

脚动两轮男之漂流小王子

Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)

donghui

DevOps jenkins jenkins-plugin

一文搞懂RSA算法

somenzz

k8s上运行我们的springboot服务之——在linux安装docker并搭建docker私服

柠檬

Docker k8s

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