在Android设备上运行Swift代码

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了在Android设备上运行Swift代码脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

脚本宝典总结

以上是脚本宝典为你收集整理的在Android设备上运行Swift代码全部内容,希望文章能够帮你解决在Android设备上运行Swift代码所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。