资讯专栏INFORMATION COLUMN

在Android设备上运行Swift代码

muddyway / 699人阅读

摘要:目前,的标准库可以被编译运行在环境下,这就意味着我们可以在一个承载着系统的移动设备上运行代码。本部分也就是说明如何在设备上运行熟知的。需要注意的是,虽然现在编译器能够直接在设备上运行代码,但是并不意味着你可以用来直接写一个了。

Quick Start

Getting Started with Swift on Android

目前,Swift的标准库stdlib可以被编译运行在Android armv7环境下,这就意味着我们可以在一个承载着Android系统的移动设备上运行Swift代码。本部分也就是说明如何在Android设备上运行熟知的Hello World。如果你在实践的过程中发现了什么问题,可以在这里寻求帮助。

需要注意的是,虽然现在Swift编译器能够直接在Android设备上运行Swift代码,但是并不意味着你可以用Swift来直接写一个APP了。对于一个常见的APP而言还包含着大量的用户界面的构建,这并不是Swift stdlib所能支持的。不过你可以选择从Swift中调用Java的界面构造,但是这个和OJC与Swift之间的关系也不一样,Swift编译器并不能够对这一步进行优化。

Prerequisites

首先,你需要准备以下的开发环境:

一个能够从源码编译Swift的Linux环境。目前stdlib仅支持在Linux环境下完成编译,你需要先保证你的环境能够成功按照Swift项目的README中的指示进行编译。

Android NDK 21或者以上版本,在http://developer.android.com/ndk/downloads/index.html下载。

一个开启了远程调试的Android设备。我们需要用远程调试来部署stdlib编译好的版本,可以根据https://developer.chrome.com/devtools/docs/remote-debugging这个来启动远程调试。

Hello World 构建Swift Android标准库依赖

首先我们需要构建以下标准库

apt-get install libicu-dev icu-devtools

另外为了构建libiconv与libic:

(1)确保已经安装了curlautoconfautomakelibtool以及git工具。

(2)使用git clone git@github.com:SwiftAndroid/libiconv-libicu-android.git命令从项目中克隆下源代码。

(3)在命令行中运行which ndk-build,来确保部署好的NDK能够成功执行。

(4)进入libiconv-libicu-android目录然后启动build.sh脚本。

(5)确保在libiconv-libicu-android目录下出现了armeabi-v7a/icu/source/i18narmeabi-v7a/icu/source/common两个文件夹。

构建Android的Swift stdlib

进入Swift文件夹,运行构建脚本,注意要传入Android 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并且运行在Android设备上

创建一个简单的Swift文件,叫做hello.swift

print("Hello, Android")

使用Swift编译器进行编译,注意选择的目标要是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-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

这一步骤最后会创建一个hello的可执行文件,如果你打算在Linux环境下运行该文件,可能出现以下错误:

cannot execute binary file: Exec format error
部署到设备上

你需要使用adb push命令来讲刚才构建好的可执行程序从Linux环境中复制到Android设备上。确保你的设备已经成功连接到了Linux系统上,可以使用adb devices命令进行验证,然后使用如下命令来讲Swift Android stdlib复制到设备上:

``

$ 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

另外,你也需要复制Android NDK的libc++:

$ adb push ~/android-ndk-r10e/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp

最后,你需要将`hello`这个可编译包复制过去:

$ adb push hello /data/local/tmp

### 运行Hello World

在将所有的依赖项与可执行程序复制到了Android系统中之后,可以使用`adb shell`命令来执行`hello`这个可执行程序:

$ adb shell LD_LIBRARY_PATH=/data/local/tmp hello

那么将得到如下的结果:

Hello, Android

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12718.html

相关文章

  • 如何通过热修复,搞定开发中的那些 Bug?

    摘要:作为程序员,修复终究是绕不开的话题,本期移动开发精英俱乐部讨论的主题便是修复中的,即热修复。王威威对已发布进行修复。王伟我们会在本地测试好,通过验证后才正式发送修复脚本。海不是简单的性能问题,如果要同时修复两个线程的方法就悲剧了。 作为程序员,Bug 修复终究是绕不开的话题,本期移动开发精英俱乐部讨论的主题便是 Bug 修复中的 Hotfix,即热修复。接下来让我们跟随大牛的脚步来了解...

    lcodecorex 评论0 收藏0
  • fir.im Weekly - 2016 开年技术干货分享

    摘要:开年上班,北上广的技术陆续重返人间。苹果给出了新的安全证书供用户下载,查证后提供了自己的解决办法。以上是本期,祝大家开工大吉。 开年上班,北上广的技术er 陆续重返人间。看到别人已返工写代码,竟然有种慌慌的感觉(ง •̀_•́)ง 勤奋好学如你,fir.im weekly 送上最新一波技术分享供你 品味…… 给iOS开发者的Sketch入门教程 来自@CocoaChina的翻译整理。...

    waruqi 评论0 收藏0
  • fir.im Weekly - 2016 开年技术干货分享

    摘要:开年上班,北上广的技术陆续重返人间。苹果给出了新的安全证书供用户下载,查证后提供了自己的解决办法。以上是本期,祝大家开工大吉。 开年上班,北上广的技术er 陆续重返人间。看到别人已返工写代码,竟然有种慌慌的感觉(ง •̀_•́)ง 勤奋好学如你,fir.im weekly 送上最新一波技术分享供你 品味…… 给iOS开发者的Sketch入门教程 来自@CocoaChina的翻译整理。...

    Miracle_lihb 评论0 收藏0
  • Capacitor 新一代混合应用“神器” 会代替Cordova吗??

    摘要:介绍畅想是由团队最新开发维护的一个跨平台的应用程序容器,可以轻松构建在,,和上本机运行的应用程序。后者旨在替代或者说是进化。希望看到在未来发展,以及正式发布。我认为它有可能大大改善混合应用开发体验。 1.介绍or畅想 Capacitor是由ionic团队最新开发维护的一个跨平台的应用程序容器,可以轻松构建在iOS,Android,Electron和Web上本机运行的Web应用程序。我们...

    番茄西红柿 评论0 收藏0
  • fir.im Weekly - 每个程序员都应当拥有的技能树

    摘要:本周收集了一些优秀的开发资源和程序员技能拓展的知道创宇研发技能表作为程序员可能都听说过知道创宇,他们是一家黑客文化浓厚的安全公司。这张技能表为知道创宇研发工程师的技能树集合,是的,很庞大。聪明的人,会根据每个自驱动扩展。 本周收集了一些优秀的 iOS & Android 开发资源和程序员 IT 技能拓展的 Tips. 知道创宇研发技能表 v3.0 作为程序员可能都听说过【知道创宇】,他...

    alanoddsoff 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<