Skip to content

Update to Swift 6.1 #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# These are supported funding model platforms
ko_fi: colemancda
15 changes: 15 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
**Issue**

Fixes #1.

**What does this PR Do?**

Description of the changes in this pull request.

**Where should the reviewer start?**

`main.swift`

**Sweet giphy showing how you feel about this PR**

![Giphy](https://media.giphy.com/media/rkDXJA9GoWR2/giphy.gif)
21 changes: 21 additions & 0 deletions .github/workflows/swift.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Swift
on: [push]
jobs:

android:
name: Android
strategy:
fail-fast: false
matrix:
swift: ['6.1']
arch: ['aarch64', 'x86_64']
sdk: ['24', '28', '29']
runs-on: macos-15
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: "Build Swift Package for Android"
run: |
brew install skiptools/skip/skip || (brew update && brew install skiptools/skip/skip)
skip android sdk install --version ${{ matrix.swift }}
ANDROID_NDK_ROOT="" ANDROID_SDK_VERSION=${{ matrix.sdk }} skip android build --arch ${{ matrix.arch }} --android-api-level ${{ matrix.sdk }}
2 changes: 1 addition & 1 deletion Demo/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ android {

defaultConfig {
applicationId = "com.pureswift.swiftandroid"
minSdk = 24
minSdk = 29
targetSdk = 35
versionCode = 1
versionName = "1.0"
Expand Down
12 changes: 0 additions & 12 deletions Demo/build-swift-preview.sh

This file was deleted.

6 changes: 1 addition & 5 deletions Demo/build-swift.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@ set -e
source swift-define

# Build with SwiftPM
export JAVA_HOME=$SWIFT_ANDROID_SYSROOT/usr
xcrun --toolchain swift swift build -c $SWIFT_COMPILATION_MODE \
--swift-sdk $SWIFT_TARGET_NAME \
--toolchain $XCTOOLCHAIN \
--package-path $SWIFT_PACKAGE_SRC
ANDROID_NDK_ROOT="" ANDROID_SDK_VERSION=$ANDROID_SDK_VERSION skip android build --arch $SWIFT_TARGET_ARCH --android-api-level $ANDROID_SDK_VERSION

# Copy compiled Swift package
mkdir -p $SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
Expand Down
25 changes: 5 additions & 20 deletions Demo/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,17 @@ source swift-define
# Install macOS dependencies
if [[ $OSTYPE == 'darwin'* ]]; then
echo "Install macOS build dependencies"
brew install skiptools/skip/skip
brew update
HOMEBREW_NO_AUTO_UPDATE=1 brew install wget cmake ninja android-ndk

# Verify toolchain installed
if [ ! -d ${XCTOOLCHAIN} ]
then
echo "Please install the swift-6.0.3-RELEASE toolchain (or set XCTOOLCHAIN)"
echo "On Mac: https://download.swift.org/swift-6.0.3-release/xcode/swift-6.0.3-RELEASE/swift-6.0.3-RELEASE-osx.pkg"
exit 1
fi
fi

# Check swift-autolink-extract exists
if [[ ! -f "${XCTOOLCHAIN}/usr/bin/swift-autolink-extract" ]];
then
echo "Missing symlink '${XCTOOLCHAIN}/usr/bin/swift-autolink-extract'."
echo "We need 'sudo' permission to create it (just this once)."
sudo ln -s swift ${XCTOOLCHAIN}/usr/bin/swift-autolink-extract || exit 1
fi

# Copy Swift libraries
rm -rf $SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
mkdir -p $SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
cp -rf $SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/*.so \
cp -rf $SWIFT_ANDROID_LIBS/*.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
# Copy C stdlib
cp -rf $SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
# Copy Swift dependencies
cp -rf $SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libandroid-spawn.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
echo "Copied Swift libraries"
13 changes: 8 additions & 5 deletions Demo/swift-define
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,19 @@ ANDROID_LIB="${ANDROID_LIB:=aarch64-linux-android}"
SWIFT_COMPILATION_MODE="${SWIFT_COMPILATION_MODE:=debug}"

# Version
ANDROID_NDK_VERSION=24
SWIFT_VERSION_SHORT=6.0.3
ANDROID_SDK_VERSION=29
SWIFT_VERSION_SHORT=6.1.1
SWIFT_VERSION=swift-$SWIFT_VERSION_SHORT-RELEASE
SWIFT_TARGET_NAME=$SWIFT_TARGET_ARCH-unknown-linux-android$ANDROID_NDK_VERSION
SWIFT_TARGET_NAME=$SWIFT_TARGET_ARCH-unknown-linux-android$ANDROID_SDK_VERSION
XCTOOLCHAIN=/Library/Developer/Toolchains/$SWIFT_VERSION.xctoolchain
SWIFT_ARTIFACT_BUNDLE=swift-$SWIFT_VERSION_SHORT-RELEASE-android-0.1.artifactbundle

# Paths
SWIFT_SDK=swift-$SWIFT_VERSION_SHORT-release-android-$ANDROID_NDK_VERSION-sdk
SWIFT_ANDROID_SYSROOT=~/.swiftpm/swift-sdks/swift-$SWIFT_VERSION_SHORT-RELEASE-android-24-0.1.artifactbundle/$SWIFT_SDK/android-27c-sysroot
SWIFT_SDK=swift-$SWIFT_VERSION_SHORT-release-android-$ANDROID_SDK_VERSION-sdk
SWIFT_ANDROID_SYSROOT=~/.swiftpm/swift-sdks/$SWIFT_ARTIFACT_BUNDLE/swift-android/ndk-sysroot
SWIFT_ANDROID_LIBS=~/.swiftpm/swift-sdks/$SWIFT_ARTIFACT_BUNDLE/swift-android/swift-resources/usr/lib/swift-$SWIFT_TARGET_ARCH/android/
SWIFT_PACKAGE_SRC=$SRC_ROOT
JAVA_HOME=$SWIFT_ANDROID_SYSROOT/usr

# Configurable
SWIFT_NATIVE_PATH="${SWIFT_NATIVE_PATH:=$XCTOOLCHAIN/usr/bin}"
41 changes: 1 addition & 40 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,44 +1,10 @@
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

// swift-tools-version: 6.1
import CompilerPluginSupport
import PackageDescription

import class Foundation.FileManager
import class Foundation.ProcessInfo

// Note: the JAVA_HOME environment variable must be set to point to where
// Java is installed, e.g.,
// Library/Java/JavaVirtualMachines/openjdk-21.jdk/Contents/Home.
func findJavaHome() -> String {
if let home = ProcessInfo.processInfo.environment["JAVA_HOME"] {
return home
}

// This is a workaround for envs (some IDEs) which have trouble with
// picking up env variables during the build process
let path = "\(FileManager.default.homeDirectoryForCurrentUser.path()).java_home"
if let home = try? String(contentsOfFile: path, encoding: .utf8) {
if let lastChar = home.last, lastChar.isNewline {
return String(home.dropLast())
}

return home
}

fatalError("Please set the JAVA_HOME environment variable to point to where Java is installed.")
}
let javaHome = findJavaHome()

let javaIncludePath = "\(javaHome)/include"
#if os(Linux)
let javaPlatformIncludePath = "\(javaIncludePath)/linux"
#elseif os(macOS)
let javaPlatformIncludePath = "\(javaIncludePath)/darwin"
#elseif os(Windows)
let javaPlatformIncludePath = "\(javaIncludePath)/win32"
#endif

// Get NDK version from command line
let ndkVersion = ProcessInfo.processInfo.environment["ANDROID_NDK_VERSION"].flatMap { UInt($0) } ?? 27
let ndkVersionDefine = SwiftSetting.define("ANDROID_NDK_VERSION_" + ndkVersion.description)
Expand Down Expand Up @@ -118,10 +84,6 @@ var package = Package(
name: "JavaKitReflection",
package: "swift-java"
),
.product(
name: "Binder",
package: "Binder"
),
"AndroidNDK",
"AndroidJava",
"AndroidManifest",
Expand All @@ -140,7 +102,6 @@ var package = Package(
],
swiftSettings: [
.swiftLanguageMode(.v5),
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"]),
ndkVersionDefine,
sdkVersionDefine
]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Swift bindings to Android SDK (via Java Native Interface)

## Compile

Tested against [@finagolfin Swift Android SDK](https://github.com/finagolfin/swift-android-sdk) v6.0.3
Tested against [Skip Tools](https://skip.tools/docs/gettingstarted/#installation)

There is an included example Android application under `/Demo`.

Expand Down
21 changes: 0 additions & 21 deletions swift-define

This file was deleted.