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

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程序。

(0)

相关推荐

  • Android笔记之:深入为从右向左语言定义复杂字串的详解

    我们所使用的语言,无论是中文还是英语,都是从左向右读的(Left-To-Right),因此我们已经十分习惯了从左向右读(Left-To-Right).一旦遇到了从右向左读的(Right-To-Left),便会十分的不习惯,甚至比见到火星文还难受.光看着就令人难受了,但更让人崩溃的是,还要为应用去定义Arabic语言的字串,也就是为应用添加Arabic语言支持,不但要查看大量的Arabic天书,还要处理一些复杂的字串.对于Right-To-Left的语言,最理想就是以下二种Case,它不需要特别的

  • Android键盘输入语言设置默认打开myanmar缅甸语的步骤

    locale是通过系统设置的地区和latin输入法语言通过merger出来的,所以在系统地区设置和输入法语言中同时支持才可以在"输入语言设置"里设置 languageList是从存储latin输入法设置的latin_preferences.xml文件里读取出来的,上一次设置的输入语言 如果要设置某种语言在输入法默认打开可按一下步骤添加文件,我这里已经验证时OK的,你可以试一下. 提供简单的sample code,如默认将缅甸语.英文.法语输入法勾选: 1.书写文件LatinImeRec

  • Android实现app应用多语言切换功能

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成,下次重新打开 App ,也是用户设置的语言. 2. 实现步骤  1). 添加多语言文件  在不同的 value 文件夹下(例如 value .value-en.values-zh-rTW 文件夹)添加不同语言的 string.xml 文件,我们的项目添加了英文.简体中文.繁体中文三种语言,如下图所示

  • Android 各国语言缩写及简称详细介绍

    android资源文件夹的写法规则: 语言缩写-国家地区缩写 语言缩写请参阅: 国家地区缩写 en 英文 en_US 英文 (美国) ar 阿拉伯文 ar_AE 阿拉伯文 (阿拉伯联合酋长国) ar_BH 阿拉伯文 (巴林) ar_DZ 阿拉伯文 (阿尔及利亚) ar_EG 阿拉伯文 (埃及) ar_IQ 阿拉伯文 (伊拉克) ar_JO 阿拉伯文 (约旦) ar_KW 阿拉伯文 (科威特) ar_LB 阿拉伯文 (黎巴嫩) ar_LY 阿拉伯文 (利比亚) ar_MA 阿拉伯文 (摩洛哥) a

  • php简单实现多语言切换的方法

    本文实例讲述了php简单实现多语言切换的方法.分享给大家供大家参考,具体如下: 1.主程序代码: <?php include "lib/function.php"; ?> <script src="js/language.js"></script> <?php if(isset($_GET["language"])){ $_SESSION["language"] = $_GET[&qu

  • 为Android添加一门新语言的解决办法

    虽然Android从2.3开始已经支持50种以上的语言,但是不是每种语言都有字体可以显示.遇到一个新需求,有客户要求对hindi语言的支持.于是上网找了一些资料,发现网上介绍的大部分是如何替换默认字体,就是替换./frameworks/base/data/fonts/DroidSansFallback.ttf,但是替换完之后,中文就无法正常显示.其实只要有下面几个步骤,就可以实现新曾加一种语言的显示支持:1. 需要有可以显示hindi语言的字体,我在网上下载了一个:DroidHindi.ttf2

  • Android实现系统语言切换功能

    简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项"设置系统语言"功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能.起初想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题.下面介绍下网上找的几个方案. 一.API欺骗 烧制到手机中的android.jar包含了Android所

  • 多种语言(big5\gbk\gb2312\utf8\Shift_JIS\iso8859-1)的网页编码切换解决方案归纳

    1.response.setContentType("text/html; charset=GB2312"); 或者response.setContentType("text/html; charset=UTF-8"); charset前面留一个空格 2.头文件包含 3. 一般处理是将在网页上提交的中文转码为Unicode存储在数据库中,取出来的 时候,用自动转码(ContentType="text/html;charset=gb2312"或Co

  • 深入剖析Android中init进程实现的C语言源码

    概述 init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程.init的进程号是1.作为天字第一号进程,init有很多重要的工作: init提供property service(属性服务)来管理Android系统的属性. init负责创建系统中的关键进程,包括zygote. 以往的文章一上来就介绍init的源码,但是我这里先从这两个主要工作开始.搞清楚这两个主要工作是如何实现的,我

  • android 支持的语言列表(汇总)

    Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及Arabic, Israel (ar_IL) -------------------------------阿拉伯语,以色列Bulgarian, Bulgaria (bg_BG) ---------------------保加利亚语,保加利亚Catalan, Spain (ca_ES) ---------------------------加泰隆语,西班牙Czech, Czech

随机推荐