用 Swift 编写 Android 应用
来自Github上的一个项目,用Swift语言编写Android的Helloworld教程……所谓生命在于折腾-_-~...
“
项目地址:https://github.com/apple/swift/blob/master/docs/Android.md
Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。本文解释了如何在你的安卓手机上运行一个简单的“hello, world”程序。
遇到问题请参考下面的说明,上传BUG到 https://bugs.swift.org/.
FAQ
先回答以下经常被问及的问题:
并不能……
虽然Swift编译器可以在安卓设备上编译Swift代码并运行,但这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建UI,以上这些Swift标准库不能提供。
另一方面,理论上来说是可以从Swift调用Java应用程序接口,但是不同于Objective-C,Swift编译器对Swift-to-Java桥接毫无作用。
前置条件
- 可以编译Swift源码的Linux环境。stdlib目前只能在Linux环境下编译成安卓可用版本。在尝试为安卓构建之前,确保你能够根据Swift项目的README为Linux做编译。
- 安卓NDK,21版本或以上,可以从以下链接下载:http://developer.android.com/ndk/downloads/index.html.
- 一台可以远程调试的安卓设备。我们需要通过远程调试来将stdlib结果部署到安卓设备上。你可以按以下官方向导来远程调试:https://developer.chrome.com/devtools/docs/remote-debugging.
安卓上的”Hello, world"
你可能注意到了,为了构建Linux下的Swift stdlib,你需要 apt-get install libicu-dev icu-devtools。 简单来说,构建在安卓设备上使用的Swift stdlib需要libiconv和libicu。然而,你需要这些库的安卓设备版本。
为安卓设备构建libiconv和libicu:
1. 确定你安装了 curl, antoconf, antomake, libtook 和git。
2. 克隆 SwiftAndroid/libiconv-libicu-android 项目。通过命令行执行以下命令:git clone git@github.com:SwiftAndroid/libiconv-libicu-android.git。
3. 在命令行执行 which ndk-build。确定在你下载的安卓NDK里ndk-build能显示可执行路径。如果不能显示,你需要将安卓NDK的目录加到你的PATH里。
4. 在命令行输入 libiconv-libicu-android 目录,然后执行 build.sh。
5. 确定构建脚本在你的libiconv-libicu-android目录构建了 armeabi-v7a/icu/source/i18n和armeabi-v7a/icu/source/common目录。
构建安卓使用的Switf stdlib
输入你的Swift目录,然后运行构建脚本,将路径传递给安卓NDK和libicu/libiconv目录:
$ utils/build-script
-R
# Build in ReleaseAssert mode.
--android
# Build for Android.
--android-ndk ~/android-ndk-r10e
# Path to an Android NDK.
--android-ndk-version 21
# The NDK version to use. Must be 21 or greater.
--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/
编译hello.swift并在安卓设备上运行
创建一个简单的Swift文件,命名为 hello.swift:
使用步骤2中构建好的Swift编译器来编译Swift源码,目标设定为安卓:print("Hello, Android")
这样应该会在你执行命令的目录下生成一个hello可执行文件。如果你试图在你的Linux环境下执行这个可执行文件,你会看到如下错误:$ 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-r10e/platforms/android-21/arch-arm
# Use the same NDK path and version as you used to build the stdlib in the previous step.
-L ~/android-ndk-r10e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a
# Link the Android NDK's libc++ and libgcc.
-L ~/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8
hello.swift
这正是我们想要的错误:因为这是为执行在安卓设备上构建的可执行文件--它不应该能在Linux上执行。下一步,让我们将它部署到安卓设备上来执行它。cannot execute binary file: Exec format error
你可以使用adb push 命令来将构建好的产品从Linux环境拷贝到安卓设备。当你执行adb devices命令前确定你的设备连接好并且可以被列出,然后执行以下命令来拷贝Swift Android stdlib:
另外,你也需要拷贝安卓NDK的libc++:$ 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
最后,你需要拷贝你前一步构建好的hello可执行文件:$ adb push ~/android-ndk-r10e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
$ adb push hello /data/local/tmp
在安卓设备上执行“Hello, World"
你可以在安卓设备上使用 adb shell 命令来执行hello可执行文件:
你可以看到以下输出:$ adb shell LD_LIBRARY_PATH=/data/local/tmp hello
恭喜你!你刚刚在安卓上运行了你的第一个Swift程序。Hello, Android
翻译:
1. 每个程序员都应该了解的一件事
2. iOS开发神器Injection for Xcode:成吨的提高开发效率
3. 让程序员快乐其实很简单,都在这些细节里
4. 微信二维码登录原理
5. Git常用命令总结
6. 15个你必须知道的Facebook开源项目
7. 深入研究Android推送技术
8. 【脑洞】程序员眼中的世界名画
微信公众号"技术风向标",关注IT趋势,承载前沿、深入、有温度的内容。长按下方二维码加关注。
关注 技术风向标
微信扫一扫关注公众号