Skip to content
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
100 changes: 75 additions & 25 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,84 @@ on:
branches: [ main ]
workflow_dispatch:
pull_request:
branches:
- '*'
schedule:
- cron: '45 3,15 * * *'
jobs:
linux-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Test Swift Package Linux"
run: swift test
- name: "Test Swift Package Android"
if: false # issues with JNI_CreateJavaVM on Android
uses: skiptools/swift-android-action@v2
macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: "Test Swift Package macOS"
run: swift test
windows:
runs-on: windows-latest
if: false # not yet working, needs dlopen, dlsym, etc.
ci:
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
os: ['macos-15-intel', 'ubuntu-latest']

# swift: ['nightly-6.3', 'nightly-main']
swift: ['6.3']

# cannot load JVM < 31
# android-api: ['28', '36']
android-api: ['31']

android-ndk: ['r27d', 'r30-beta1']
# android-ndk: ['r27d']

runs-on: ${{ matrix.os }}

steps:
- uses: compnerd/gha-setup-swift@main
- uses: actions/checkout@v6
- name: "Test Swift Package"
run: SWIFT_JAVA_JNI_CORE=0 swift test

- name: "Test Swift Package (SWIFT_JAVA_JNI_CORE)"
run: SWIFT_JAVA_JNI_CORE=1 swift test

- name: "Setup Homebrew"
uses: Homebrew/actions/setup-homebrew@main

- name: "Install Skip"
run: |
brew install skiptools/skip/skip || (brew update && brew install skiptools/skip/skip)

- name: "Install Host Toolchain prerequisites"
if: runner.os == 'Linux'
run: |
sudo apt-get -y install libcurl4-openssl-dev || (sudo apt-get update && sudo apt-get -y install libcurl4-openssl-dev)

- name: "Install Swift SDK for Android"
run: |
# need swiftly init on Linux
swiftly init --assume-yes --no-modify-profile --skip-install
skip android sdk install --verbose --version ${{ matrix.swift }} --ndk-version ${{ matrix.android-ndk }}

- name: "Build package for Android"
run: skip android build --build-tests

- name: "Prepare Android Emulator"
run: |
if [ "${RUNNER_OS}" == 'Linux' ]; then
# set up hardware acceleration for emulator
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

# need to free disk space or the emulator fails to launch sometimes
sudo rm -rf /opt/microsoft /opt/google /opt/az /usr/share/miniconda /usr/share/az* /usr/share/glade* /usr/local/share/chromium /usr/local/share/powershell /usr/share/dotnet /opt/ghc /usr/local/.ghcup /usr/local/julia* /opt/hostedtoolcache/CodeQL /usr/local/share/boost
fi

- name: "Test Swift Package on Android"
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.android-api }}
arch: x86_64
script: |
adb logcat '*:E' 'org.swift.*':V &
SWIFT_JAVA_JNI_CORE=0 skip android test --apk --verbose

- name: "Test Swift Package on Android (SWIFT_JAVA_JNI_CORE)"
uses: reactivecircus/android-emulator-runner@v2
with:
branch: swift-6.1
tag: 6.1-RELEASE
- uses: actions/checkout@v4
- run: swift test
api-level: ${{ matrix.android-api }}
arch: x86_64
script: |
adb logcat '*:E' 'org.swift.*':V &
SWIFT_JAVA_JNI_CORE=1 skip android test --apk --verbose

31 changes: 29 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,41 @@
// swift-tools-version: 5.9
import PackageDescription

let jniDependency: Target.Dependency
let swiftSettings: [SwiftSetting]

let useSwiftJavaJNICore = Context.environment["SWIFT_JAVA_JNI_CORE"] ?? "0" == "1"

if useSwiftJavaJNICore {
// use swift-java-jni-core
jniDependency = .product(name: "SwiftJavaJNICore", package: "swift-java-jni-core")
swiftSettings = [.define("SWIFT_JAVA_JNI_CORE")]

} else {
jniDependency = .target(name: "CJNI")
swiftSettings = []
}

let package = Package(
name: "swift-jni",
products: [
.library(name: "SwiftJNI", type: .dynamic, targets: ["SwiftJNI"]),
],
dependencies: [
],
targets: [
.target(name: "CJNI"),
.target(name: "SwiftJNI", dependencies: ["CJNI"]),
.testTarget(name: "SwiftJNITests", dependencies: ["SwiftJNI"]),
.target(name: "SwiftJNI", dependencies: [
jniDependency,
], swiftSettings: swiftSettings),
.testTarget(name: "SwiftJNITests", dependencies: [
"SwiftJNI"
], swiftSettings: swiftSettings),
]
)

if useSwiftJavaJNICore {
package.dependencies += [
.package(url: "https://github.com/swiftlang/swift-java-jni-core.git", from: "0.4.0"),
]
}
Loading