使用 Swift 語言編寫 Android 應用入門
Swift標準庫可以編譯安卓armv7的核心,這使得可以在安卓移動裝置上執行Swift語句程式碼。本文解釋瞭如何在你的安卓手機上執行一個簡單的“hello,world”程式。
如果你遇到了任何問題,請參考下面的說明,上傳BUG到 https://bugs.swift.org/.
常見問題解答
讓我們來回答如下經常被問及的問題吧:
這是否以為著我能夠用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 / # 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/
3. 編譯hello.swift並在安卓裝置上執行
建立一個簡單的Swift檔案,命名為 hello.swift:
print("Hello, Android")
使用步驟2中構建好的Swift編譯器來編譯Swift原始碼,目標設定為安卓:
$ 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
這正是我們想要的錯誤:因為這是為執行在安卓裝置上構建的可執行檔案–它不應該能在Linux上執行。下一步,讓我們將它部署到安卓裝置上來執行它。
4. 將構建好的產品部署到裝置
你可以使用adb push 命令來將構建好的產品從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
另外,你也需要拷貝安卓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
5. 在安卓裝置上執行“Hello, World”
你可以在安卓裝置上使用 adb shell 命令來執行hello可執行檔案:
$ adb shell LD_LIBRARY_PATH=/data/local/tmp hello
你可以看到以下輸出:
Hello, Android
祝賀你!你剛剛在安卓上執行了你的第一個Swift程式。
相關文章
- ios應用開發+swift語言入門iOSSwift
- Swift語言快速入門Swift
- 使用Golang語言編寫Hello World Web應用GolangWeb
- Swift 程式語言入門教程Swift
- 使用Go語言開發iOS應用(Swift版)GoiOSSwift
- Apple Swift程式語言入門教程APPSwift
- Swift教程Swift語言快速入門(內部資料)Swift
- 基礎入門: 編寫第一個 Go 語言程式Go
- Swift1.1語言快速入門7.2使用無參函式Swift函式
- Qt 編寫應用支援多語言版本--一個GUI應用示例QTGUI
- 蘋果Swift程式語言入門教程【中文版】蘋果Swift
- 使用Swift語言的寫的一些appSwiftAPP
- 用PHP編寫Android應用程式PHPAndroid
- 使用Go語言開發Android&IOS應用GoAndroidiOS
- Python語言應該如何入門Python
- 用C語言編寫windows服務程式C語言Windows
- React從入門到精通系列之(18)不使用JSX編寫React應用ReactJS
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- 使用 Rust 語言編寫 Java JNI 實現RustJava
- HTML語言編寫指南HTML
- 15個快速學習蘋果Swift程式語言的入門教程蘋果Swift
- IOS開發語言Swift入門連載---型別轉換iOSSwift型別
- 用C語言編寫小遊戲——“井字棋”C語言遊戲
- 用python語言編寫網路爬蟲Python爬蟲
- 用C語言編寫的公式計算器C語言公式
- perl語言入門
- c語言入門C語言
- 機器語言編寫helloworld
- Android 音視訊入門:C語言基礎AndroidC語言
- Android Studio Grade Groovy語言入門篇Android
- Android谷歌官方語言Kotlin用法入門教程Android谷歌Kotlin
- 幽默:儘量用領域語言編寫程式碼
- 用“Whitespace”程式語言編寫無字天書
- R語言快速入門R語言
- Dart 語言入門 (四)Dart
- Go語言快速入門Go
- Groovy 語言快速入門
- C語言編寫靜態連結庫及其使用C語言