BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Androidの開発コードにSwiftを使用する

Androidの開発コードにSwiftを使用する

原文(投稿日:2016/04/24)へのリンク

先日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コードにアクセスするサンプルアプリのプロトタイプを提供している。

 
 

この記事を評価

関連性
形式
 
 

この記事に星をつける

おすすめ度
スタイル

BT