Swift と Java を相互運用するための swift-java が発表されたのが2024年10月であれから1年ほど経過しました。
発表の中では、Apple のサービスでサーバサイドリクエストを処理する Java のコードを徐々に Swift に置き換えて、相互運用していく動機について語られていました。この辺りの動機付けに関しては、ゆめみ大技林'25に寄稿しているので参照してもらえたらと思います。
技術書典マーケットとBOOTHどちらからでも無料でダウンロードできます。
今年の iOSDC Japan 2025 のパンフレット記事に入門記事を書きました。執筆時からも少しずつ変わっているため、この記事では改めて現状についてキャッチアップしていきます。
パンフレット記事に収まりきらなかった環境構築の記事も内容の更新が必要です。
swift-java の README には、環境構築について現状に合わせて反映されており、こちらを参照するのが良いです。
筆者の環境は以下の通りです。JDK のインストールに筆者は使い慣れている SDKMAN を選択しました。Swift 6.2 が必要で、macOS 15.6 以上が必要になります。JDK は swift-java で利用する機能によって異なりますが、すべてを確認する場合は 25 が必要になります。他のツールについてはミニマムバージョンについて調べていません。
| Name | version | requirements |
|---|---|---|
| macOS | 26.1 | 15.6 or later |
| Ruby | 2.6.10p210 | - |
| Homebrew | 4.6.20 | - |
| SDKMAN | 5.20.0 | - |
| JDK | 25.0.1-amzn | 25 |
| Swiftly | 1.1.0 | - |
| Swift | 6.2.1 | 6.2 |
| jemalloc | 5.3.0 | - |
この環境で以下の実行を確認できます。
テストを実行する
主にコントリビュートする際に、変更したコードに合わせてテストが用意されています。
Swift の実装をテストする
swfit test
Java の実装をテストする
./gradlew test
古い build キャッシュが残っている場合、テストに失敗することがあります。その場合は、以下のキャッシュを削除して再実行します。
rm -rf .build
筆者の環境では SwiftJavaExtractFFMSampleApp のテストが失敗したので、このキャッシュも削除しました。
rm -rf Samples/SwiftJavaExtractFFMSampleApp/.build
サンプルコードを実行する
サンプルコードを実行して動作を確認できます。
swift-java jextract
swift-java jextract 機能を利用して Swift のコードを Java に統合します。
Swift -> Java
Swift のプロセスとして実行します。
cd Samples/SwiftJavaExtractFFMSampleApp && ./ci-validate.sh
例えば、以下の Swift の実装を変更すると反映されるのが確認できます。
Swift のコード変更の一例です。
- p("\(#function)")
+ p("\(#function) --- Changed!!")
上記コード変更を適用した場合の実行結果の差分です。
-[swift][MySwiftLibrary/MySwiftLibrary.swift:29](helloWorld()) helloWorld()
+[swift][MySwiftLibrary/MySwiftLibrary.swift:29](helloWorld()) helloWorld() --- Changed!!
上記 Swift のコードを Java から呼んでいる箇所は以下になります。
Java -> Swift
Java プロセスとして実行します。コードの実体としては同じなので、変更点は同様に反映されます。
./gradlew Samples:SwiftJavaExtractFFMSampleApp:run
JavaKit
マクロを利用して Java のインターフェースを Swift で実装します。
cd Samples/JavaKitSampleApp && ./ci-validate.sh
例えば、以下の Swift の実装を変更すると反映されるのが確認できます。
Swift のコードから @JavaMethod のマクロを探すと Java のインターフェースを Swift で実装している箇所が見つかります。
ベンチマーク
Swift 実装のベンチマークを実行する
cd Benchmarks && swift package benchmark
jemalloc が必要だったので追加でインストールしました。
brew install jemalloc
Java 実装のベンチマークを実行する
cd Samples/SwiftJavaExtractFFMSampleApp && ./gradlew jmh
参考
swift-java は Swift SDK for Android の基盤にもなっていて Android 向けには六日目の記事が詳しくておすすめです。