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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,6 @@ Android.xcodeproj

# Java
*.jar

# VS Code
.vscode
24 changes: 12 additions & 12 deletions Demo/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,18 @@ android {
)
}
}
/*
// Custom Swift build task
val buildSwift by tasks.registering(Exec::class) {
group = "build"
description = "Build Swift sources"
workingDir("$projectDir")
commandLine("bash", "build-swift.sh")
}
}

tasks.withType<JavaCompile> {
dependsOn(buildSwift)
}*/
// Compile native Swift code for the demo app with `skip android build`.
val buildSwift by tasks.registering(Exec::class) {
group = "build"
description = "Build native Swift sources for Android"
workingDir(rootProject.projectDir)
commandLine("bash", "build-swift.sh")
}

tasks.named("preBuild") {
dependsOn(buildSwift)
}

dependencies {
Expand All @@ -86,4 +86,4 @@ dependencies {
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
}
}
4 changes: 2 additions & 2 deletions Demo/app/src/main/swift/HelloSubclass.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Auto-generated by Java-to-Swift wrapper generator.
import JavaKit
import JavaRuntime
import SwiftJava
import CSwiftJavaJNI

@JavaClass("com.example.swift.HelloSubclass")
open class HelloSubclass: HelloSwift {
Expand Down
6 changes: 3 additions & 3 deletions Demo/app/src/main/swift/HelloSwift.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Auto-generated by Java-to-Swift wrapper generator.
import JavaKit
import JavaKitFunction
import JavaRuntime
import SwiftJava
import JavaUtilFunction
import CSwiftJavaJNI

@JavaClass("com.example.swift.HelloSwift")
open class HelloSwift: JavaObject {
Expand Down
4 changes: 2 additions & 2 deletions Demo/app/src/main/swift/JavaKitExample.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
//
//===----------------------------------------------------------------------===//

import JavaKit
import JavaKitFunction
import SwiftJava
import JavaUtilFunction
import AndroidUtil
import AndroidLogging

Expand Down
4 changes: 2 additions & 2 deletions Demo/app/src/main/swift/JavaRetainedValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// Created by Alsey Coleman Miller on 6/9/25.
//

import JavaKit
import JavaRuntime
import SwiftJava
import CSwiftJavaJNI

/// Java class that retains a Swift value for the duration of its lifetime.
@JavaClass("com.pureswift.swiftandroid.SwiftObject")
Expand Down
2 changes: 2 additions & 0 deletions Demo/app/src/main/swift/ListViewAdapter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
//

import Foundation
import SwiftJava
import JavaUtil
import AndroidKit

@JavaClass("com.pureswift.swiftandroid.ListViewAdapter", extends: ListAdapter.self)
Expand Down
6 changes: 6 additions & 0 deletions Demo/app/src/main/swift/MainActivity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
import Foundation
import AndroidKit
import JavaLang
#if canImport(Binder)
import Binder
#endif

@JavaClass("com.pureswift.swiftandroid.MainActivity")
open class MainActivity: AndroidApp.Activity {
Expand Down Expand Up @@ -64,9 +66,11 @@ private extension MainActivity {
//setRootView()
startEmitterTimer()

#if canImport(Binder)
Task {
printBinderVersion()
}
#endif
}

func runAsync() {
Expand Down Expand Up @@ -338,6 +342,7 @@ private extension MainActivity {
.commit()
}

#if canImport(Binder)
private func printBinderVersion() {
// Print Binder version
do {
Expand All @@ -348,6 +353,7 @@ private extension MainActivity {
logError("Unable to read binder: \(error)")
}
}
#endif
}

extension MainActivity {
Expand Down
4 changes: 2 additions & 2 deletions Demo/app/src/main/swift/Runnable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// Created by Alsey Coleman Miller on 6/9/25.
//

import JavaKit
import JavaRuntime
import SwiftJava
import CSwiftJavaJNI
import AndroidKit
import JavaLang

Expand Down
4 changes: 2 additions & 2 deletions Demo/app/src/main/swift/ThreadSafeHelperClass.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Auto-generated by Java-to-Swift wrapper generator.
import JavaKit
import JavaRuntime
import SwiftJava
import CSwiftJavaJNI

@JavaClass("com.example.swift.ThreadSafeHelperClass")
open class ThreadSafeHelperClass: JavaObject {
Expand Down
2 changes: 1 addition & 1 deletion Demo/app/src/main/swift/UnitEmitter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// Created by Alsey Coleman Miller on 7/13/25.
//

import JavaKit
import SwiftJava

/// Bridge from Swift to Kotlin Coroutines
@JavaClass("com.pureswift.swiftandroid.UnitEmitter")
Expand Down
33 changes: 27 additions & 6 deletions Demo/build-swift.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,32 @@
#!/bin/bash
set -e
source swift-define
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/swift-define"
JNI_LIBS_DIR="$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH"

# Build with SwiftPM
ANDROID_NDK_ROOT="" ANDROID_SDK_VERSION=$ANDROID_SDK_VERSION skip android build --arch $SWIFT_TARGET_ARCH --android-api-level $ANDROID_SDK_VERSION
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/
cp -rf $SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug/libSwiftAndroidApp.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
mkdir -p "$JNI_LIBS_DIR/"
cp -f "$SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug/libSwiftAndroidApp.so" "$JNI_LIBS_DIR/"

# Copy Swift runtime shared libraries required by libSwiftAndroidApp.so.
if [[ -d "$SWIFT_ANDROID_RUNTIME_LIBS" ]]; then
shopt -s nullglob
for so in "$SWIFT_ANDROID_RUNTIME_LIBS"/*.so; do
cp -f "$so" "$JNI_LIBS_DIR/"
done
shopt -u nullglob
fi

# Copy SwiftJava helper library when available.
if [[ -f "$SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug/libSwiftJava.so" ]]; then
cp -f "$SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug/libSwiftJava.so" "$JNI_LIBS_DIR/"
fi

# Copy C++ runtime from Android sysroot.
if [[ -f "$SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so" ]]; then
cp -f "$SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so" "$JNI_LIBS_DIR/"
fi
46 changes: 38 additions & 8 deletions Demo/setup.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#!/bin/bash
set -e
source swift-define
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/swift-define"
JNI_LIBS_DIR="$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH"

# Install macOS dependencies
if [[ $OSTYPE == 'darwin'* ]]; then
Expand All @@ -12,11 +15,38 @@ if [[ $OSTYPE == 'darwin'* ]]; then
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_LIBS/*.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
rm -rf "$JNI_LIBS_DIR/"
mkdir -p "$JNI_LIBS_DIR/"

copied_swift_libs=0
if [[ -d "$SWIFT_ANDROID_RUNTIME_LIBS" ]]; then
shopt -s nullglob
for so in "$SWIFT_ANDROID_RUNTIME_LIBS"/*.so; do
cp -f "$so" "$JNI_LIBS_DIR/"
copied_swift_libs=1
done
shopt -u nullglob
fi

# Fallback for newer Skip/Swift SDK layouts where runtime libs are emitted into `.build`.
if [[ $copied_swift_libs -eq 0 && -d "$SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug" ]]; then
shopt -s nullglob
for so in "$SWIFT_PACKAGE_SRC/.build/$SWIFT_TARGET_NAME/debug"/libSwift*.so; do
cp -f "$so" "$JNI_LIBS_DIR/"
copied_swift_libs=1
done
shopt -u nullglob
fi

if [[ $copied_swift_libs -eq 0 ]]; then
echo "Warning: No Swift runtime libraries found to copy."
fi

# Copy C stdlib
cp -rf $SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so \
$SRC_ROOT/app/src/main/jniLibs/$ANDROID_ARCH/
if [[ -f "$SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so" ]]; then
cp -f "$SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so" \
"$JNI_LIBS_DIR/"
else
echo "Warning: libc++_shared.so not found at $SWIFT_ANDROID_SYSROOT/usr/lib/$ANDROID_LIB/libc++_shared.so"
fi
echo "Copied Swift libraries"
14 changes: 10 additions & 4 deletions Demo/swift-define
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Configurable
SRC_ROOT="${SRC_ROOT:=$(pwd)}"
SWIFT_DEFINE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SRC_ROOT="${SRC_ROOT:=$SWIFT_DEFINE_DIR}"
SWIFT_TARGET_ARCH="${SWIFT_TARGET_ARCH:=aarch64}"
ANDROID_ARCH="${ANDROID_ARCH:=arm64-v8a}"
ANDROID_LIB="${ANDROID_LIB:=aarch64-linux-android}"
Expand All @@ -11,12 +12,17 @@ SWIFT_VERSION_SHORT=6.2.3
SWIFT_VERSION=swift-$SWIFT_VERSION_SHORT-RELEASE
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
SWIFT_ARTIFACT_BUNDLE="${SWIFT_ARTIFACT_BUNDLE:=swift-$SWIFT_VERSION_SHORT-RELEASE_android.artifactbundle}"
SWIFT_SDKS_ROOT="${SWIFT_SDKS_ROOT:=$HOME/Library/org.swift.swiftpm/swift-sdks}"
if [[ ! -d "$SWIFT_SDKS_ROOT/$SWIFT_ARTIFACT_BUNDLE" ]]; then
SWIFT_SDKS_ROOT="$HOME/.swiftpm/swift-sdks"
fi

# Paths
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_ANDROID_SYSROOT="$SWIFT_SDKS_ROOT/$SWIFT_ARTIFACT_BUNDLE/swift-android/ndk-sysroot"
SWIFT_ANDROID_LIBS="$SWIFT_SDKS_ROOT/$SWIFT_ARTIFACT_BUNDLE/swift-android/swift-resources/usr/lib/swift-$SWIFT_TARGET_ARCH"
SWIFT_ANDROID_RUNTIME_LIBS="$SWIFT_ANDROID_LIBS/android"
SWIFT_PACKAGE_SRC=$SRC_ROOT
JAVA_HOME=$SWIFT_ANDROID_SYSROOT/usr

Expand Down
40 changes: 16 additions & 24 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ var package = Package(
],
dependencies: [
.package(
url: "https://github.com/PureSwift/swift-java.git",
branch: "feature/android"
url: "https://github.com/swiftlang/swift-java.git",
branch: "main"
),
.package(
url: "https://github.com/PureSwift/JavaLang.git",
Expand Down Expand Up @@ -112,27 +112,23 @@ var package = Package(
name: "AndroidKit",
dependencies: [
.product(
name: "JavaKit",
package: "swift-java"
),
.product(
name: "JavaKitCollection",
name: "SwiftJava",
package: "swift-java"
),
.product(
name: "JavaKitIO",
name: "JavaIO",
package: "swift-java"
),
.product(
name: "JavaKitNetwork",
name: "JavaNet",
package: "swift-java"
),
.product(
name: "JavaKitFunction",
name: "JavaUtilFunction",
package: "swift-java"
),
.product(
name: "JavaKitReflection",
name: "JavaLangReflect",
package: "swift-java"
),
"AndroidNDK",
Expand Down Expand Up @@ -161,47 +157,43 @@ var package = Package(
name: "AndroidJava",
dependencies: [
.product(
name: "JavaKit",
name: "SwiftJava",
package: "swift-java"
),
.product(
name: "JavaKitCollection",
package: "swift-java"
),
.product(
name: "JavaKitIO",
name: "JavaIO",
package: "swift-java"
),
.product(
name: "JavaKitNetwork",
name: "JavaNet",
package: "swift-java"
),
.product(
name: "JavaKitFunction",
name: "JavaUtilFunction",
package: "swift-java"
),
.product(
name: "JavaKitReflection",
name: "JavaLangReflect",
package: "swift-java"
),
.product(
name: "JavaKitJar",
name: "JavaUtilJar",
package: "swift-java"
),
.product(
name: "JavaLang",
package: "JavaLang"
),
.product(
name: "JavaUtil",
name: "JavaLangUtil",
package: "JavaLang"
),
.product(
name: "JavaIO",
name: "JavaLangIO",
package: "JavaLang"
),
.product(
name: "JavaNet",
name: "JavaLangNet",
package: "JavaLang"
),
.product(
Expand Down
2 changes: 1 addition & 1 deletion Sources/AndroidAnimation/AndroidAnimation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
// Created by Alsey Coleman Miller on 6/7/25.
//

import JavaKit
import SwiftJava
Loading