先日Swiftの公式リポジトリのマスタブランチにマージされた“Port to Android”プルリクエストによって,Android用の簡単なプログラムの作成が可能になった。このプルリクエストはSwiftのターゲットとしてAndroidを加えるもので,Linux環境を使用してARMv7プロセッサを搭載したAndroid用のクロスコンパイルを行なう。
Swift port to Androidの大半は,2人の開発者によって作成された — 2015年末にプロジェクトを立ち上げたZhowei Zhang氏と,PRを提出し,最終的にマスタにマージされるまでのフィードバックに対応した,FacebookのBrian Gesiak氏だ。当初は変更ファイル数54というPRの規模の大きさのため,提出からマージまでほぼ2ヶ月が必要だった。
前述のように,現時点で可能なことは,Linux環境からAndroidへのクロスコンパイルに限定されている。加えて,Android NDKの最新バージョンと,Android用にビルドされたlibiconv
およびlibicu
ライブラリも必要だ。これら必要なものが揃えば,次のコマンドでSwift for Androidを構築できる。
$ utils/build-script \
-R \ # Build in ReleaseAssert mode.
-T \ # Run all tests.
--android \ # Build for Android.
--android-deploy-device-path /data/local/tmp \ # Temporary directory on the device where Android tests are run.
--android-ndk ˜/android-ndk-r10e \ # Path to an Android NDK.
--android-ndk-version 21 \
--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/
コンパイラが利用可能になれば,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-r11c/platforms/android-21/arch-arm \ # Use the same NDK path and API version as you used to build the stdlib in the previous step.
-L ˜/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \ # Link the Android NDK's libc++ and libgcc.
-L ˜/android-ndk-r11c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9 \
hello.swift
作成した実行ファイルは,Swift stdlibとAndroid NKDのlibc++
とともに,adb push
コマンドを使って実際のAndroidデバイスにデプロイできる。
$ 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
$ adb push ˜/android-ndk-r11c/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so /data/local/tmp
$ adb push hello /data/local/tmp
そして最後に,adb shell
コマンドを使用してプログラムを実行する。
現時点で含まれているのはSwift srdlibのみであるため,グラフィカルなユーザインターフェースを持つような,本格的なAndroidアプリを効率的に作成できるようになるまでには,やるべき仕事がまだ多く残っている。これを実現するためには2つの方法がある。Android上で動作可能なSwift UIフレームワーク的なものを用いる方法と,Android Javaフレームワークにインターフェースする方法だ。ただし注意しなくてはならないのは,現在のSwiftコンパイラには,Objective Cコードで用意されているような,SwiftからJavaコードに簡単にブリッジするための機構は用意されていない,ということだ。
もうひとつ,実際のAndroidアプリ内からSwiftコードを利用する方法として考えられるのは,JNI/NDKを使ってSwiftコードをJavaから呼び出すことだ。Zhang氏が,AndroidのJavaアプリからJNI経由でSwiftコードにアクセスするサンプルアプリのプロトタイプを提供している。
この記事を評価
- 編集者評
- 編集長対応