使用 Swift 语言编写 Android 应用入门

所属分类: 软件编程 / Android 阅读数: 1372
收藏 0 赞 0 分享

Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。本文解释了如何在你的安卓手机上运行一个简单的“hello,world”程序。

常见问题解答

让我们来回答如下经常被问及的问题吧:

这是否以为着我能够用Swift快速的开发安卓应用?

做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。

另一方面,一个理论上可以从Swift调用Java应用程序接口,但是不同于Objective-C,Swift编译器对Swift-to-Java桥接毫无作用。

预备知识

为了能顺利使用这份向导,你需要:

1. 可以编译Swift源码的Linux环境。stdlib目前只能在Linux环境下编译成安卓可用版本。在尝试为安卓构建之前,确保你能够参考Swift项目的README为Linux做编译。

2. 安卓NDK,高于或等于21版本,在以下链接提供下载:

http://developer.android.com/ndk/downloads/index.html.

3. 一台可以远程调试的安卓设备。我们需要通过远程调试来讲stdlib结果部署到安卓设备上。你可以按以下官方向导来远程调试:https://developer.chrome.com/devtools/docs/remote-debugging.

安卓上的”Hello, world" 1. 构建Swift Android stdlib 依赖

你可能注意到了,为了构建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目录。

2. 构建安卓使用的Switf stdlib

输入你的Swift目录,然后运行构建脚本,将路径传递给安卓NDK和libicu/libiconv目录:

$utils/build-script\-R\#BuildinReleaseAssertmode.--android\#BuildforAndroid.--android-ndk~/android-ndk-r10e\#PathtoanAndroidNDK.--android-ndk-version21\#TheNDKversiontouse.Mustbe21orgreater.--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/[/code]
3. 编译hello.swift并在安卓设备上运行

创建一个简单的Swift文件,命名为 hello.swift:

print("Hello,Android")[/code]

使用步骤2中构建好的Swift编译器来编译Swift源码,目标设定为安卓:

$build/Ninja/ReleaseAssert/swift-linux-x86_64/swiftc\#TheSwiftcompilerbuiltinthepreviousstep.-targetarmv7-none-linux-androideabi\#Targetingandroid-armv7.-sdk~/android-ndk-r10e/platforms/android-21/arch-arm\#UsethesameNDKpathandversionasyouusedtobuildthestdlibinthepreviousstep.-L~/android-ndk-r10e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a\#LinktheAndroidNDK'slibc++andlibgcc.-L~/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8\hello.swift[/code]

这样应该会在你执行命令的目录下生成一个hello可执行文件。如果你试图在你的Linux环境下执行这个可执行文件,你会看到如下错误:

复制代码 代码如下:
cannotexecutebinaryfile:Execformaterror

这正是我们想要的错误:因为这是为执行在安卓设备上构建的可执行文件--它不应该能在Linux上执行。下一步,让我们将它部署到安卓设备上来执行它。

4. 将构建好的产品部署到设备

你可以使用adb push 命令来将构建好的产品从Linux环境拷贝到安卓设备。当你执行adb devices命令前确定你的设备连接好并且可以被列出,然后执行以下命令来拷贝Swift Android stdlib:

$adbpushbuild/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftCore.so/data/local/tmp$adbpushbuild/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftGlibc.so/data/local/tmp$adbpushbuild/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftOnoneSupport.so/data/local/tmp$adbpushbuild/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftRemoteMirror.so/data/local/tmp$adbpushbuild/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftSwiftExperimental.so/data/local/tmp[/code]

另外,你也需要拷贝安卓NDK的libc++:

$adbpush~/android-ndk-r10e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so/data/local/tmp[/code]

最后,你需要拷贝你前一步构建好的hello可执行文件:

$adbpushhello/data/local/tmp[/code] 5. 在安卓设备上执行“Hello, World"

你可以在安卓设备上使用 adb shell 命令来执行hello可执行文件:

$adbshellLD_LIBRARY_PATH=/data/local/tmphello[/code]

你可以看到以下输出:

复制代码 代码如下:
Hello,Android

祝贺你!你刚刚在安卓上运行了你的第一个Swift程序。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多