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
10 changes: 5 additions & 5 deletions .github/actions/prepare_env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ runs:
with:
distribution: ${{ matrix.jdk_vendor }}
java-version: |
24
25
17
cache: 'gradle'
- name: Set JAVA_HOME_{N}
Expand All @@ -23,10 +23,10 @@ runs:
elif [[ -n "$JAVA_HOME_21_ARM64" ]]; then
echo "JAVA_HOME_21=$JAVA_HOME_21_ARM64" >> $GITHUB_ENV
fi
if [[ -n "$JAVA_HOME_24_X64" ]]; then
echo "JAVA_HOME_24=$JAVA_HOME_24_X64" >> $GITHUB_ENV
elif [[ -n "$JAVA_HOME_24_ARM64" ]]; then
echo "JAVA_HOME_24=$JAVA_HOME_24_ARM64" >> $GITHUB_ENV
if [[ -n "$JAVA_HOME_25_X64" ]]; then
echo "JAVA_HOME_25=$JAVA_HOME_25_X64" >> $GITHUB_ENV
elif [[ -n "$JAVA_HOME_25_ARM64" ]]; then
echo "JAVA_HOME_25=$JAVA_HOME_25_ARM64" >> $GITHUB_ENV
fi
# - name: Check Java environment
# shell: bash
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ plugins {

java {
toolchain {
languageVersion = JavaLanguageVersion.of(24)
languageVersion = JavaLanguageVersion.of(25)
}
}

Expand Down
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,9 @@ This does require the use of the relatively recent [JEP-454: Foreign Function &
This is the primary way we envision calling Swift code from server-side Java libraries and applications.

Required language/runtime versions:
- **Swift 6.1**, because of dependence on rich swift interface files
- **JDK 25+**, the most recent LTS release which includes the stable Foreign Function and Memory APIs.
- **Swift 6.1**, because of dependence on rich swift interface files
- **JDK 25+**
- We are validating the implementation using the currently supported non-LTE release, which at present means JDK-25.

## swift-java jextract --mode=jni

Expand All @@ -101,7 +102,7 @@ This project contains multiple builds, living side by side together.

You will need to have:
- Swift (6.1.x+)
- Java (24+ for FFM, even though we support lower JDK targets)
- Java (25+ for FFM, even though we support lower JDK targets)
- Gradle (installed by "Gradle wrapper" automatically when you run gradle through `./gradlew`)

### Preparing your environment
Expand All @@ -120,12 +121,12 @@ however any recent enough Java distribution should work correctly. You can use s
# Install sdkman from: https://sdkman.io
curl -s "https://get.sdkman.io" | bash
sdk install java 17.0.15-amzn
sdk install java 24.0.1-amzn
sdk install java 25.0.1-amzn

sdk use java 24.0.1-amzn
sdk use java 25.0.1-amzn
```

The use of JDK 24 is required to build the project, even though the libraries being published may target lower Java versions.
The use of JDK 25 is required to build the project, even though the libraries being published may target lower Java versions.

❗️ Please make sure to `export JAVA_HOME` such that swift-java can find the necessary java libraries!
When using sdkman the easiest way to export JAVA_HOME is to export the "current" used JDK's home, like this:
Expand Down
17 changes: 9 additions & 8 deletions Samples/SwiftAndJavaJarSampleLib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,15 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

dependencies {
implementation(project(':SwiftKitCore'))
implementation(project(':SwiftKitFFM'))

testRuntimeOnly("org.junit.platform:junit-platform-launcher") // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand All @@ -54,16 +55,16 @@ def swiftProductsWithJExtractPlugin() {
def stdout = new ByteArrayOutputStream()
def stderr = new ByteArrayOutputStream()

def result = exec {
commandLine 'swift', 'package', 'describe', '--type', 'json'
standardOutput = stdout
errorOutput = stderr
ignoreExitValue = true
}
def processBuilder = new ProcessBuilder('swift', 'package', 'describe', '--type', 'json')
def process = processBuilder.start()

process.consumeProcessOutput(stdout, stderr)
process.waitFor()

def exitValue = process.exitValue()
def jsonOutput = stdout.toString()

if (result.exitValue == 0) {
if (exitValue == 0) {
def json = new JsonSlurper().parseText(jsonOutput)
def products = json.targets
.findAll { target ->
Expand Down
14 changes: 7 additions & 7 deletions Samples/SwiftAndJavaJarSampleLib/ci-validate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ SWIFT_VERSION="$(swift -version | awk '/Swift version/ { print $3 }')"
# This is how env variables are set by setup-java
if [ "$(uname -m)" = 'arm64' ]; then
ARCH=ARM64
JAVAC="${JAVA_HOME_24_ARM64}/bin/javac"
JAVA="${JAVA_HOME_24_ARM64}/bin/java"
JAVAC="${JAVA_HOME_25_ARM64}/bin/javac"
JAVA="${JAVA_HOME_25_ARM64}/bin/java"
else
ARCH=X64
JAVAC="${JAVA_HOME_24_X64}/bin/javac"
JAVA="${JAVA_HOME_24_X64}/bin/java"
JAVAC="${JAVA_HOME_25_X64}/bin/javac"
JAVA="${JAVA_HOME_25_X64}/bin/java"
fi

if [ -n "$JAVA_HOME_24_$ARCH" ]; then
export JAVA_HOME="$JAVA_HOME_24_$ARCH"
if [ -n "$JAVA_HOME_25_$ARCH" ]; then
export JAVA_HOME="$JAVA_HOME_25_$ARCH"
elif [ "$(uname -s)" = 'Linux' ]
then
export PATH="${PATH}:/usr/lib/jvm/jdk-24/bin" # we need to make sure to use the latest JDK to actually compile/run the executable
export PATH="${PATH}:/usr/lib/jvm/jdk-25/bin" # we need to make sure to use the latest JDK to actually compile/run the executable
fi

# check if we can compile a plain Example file that uses the generated Java bindings that should be in the generated jar
Expand Down
17 changes: 9 additions & 8 deletions Samples/SwiftJavaExtractFFMSampleApp/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,24 +31,24 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

def swiftProductsWithJExtractPlugin() {
def stdout = new ByteArrayOutputStream()
def stderr = new ByteArrayOutputStream()

def result = exec {
commandLine 'swift', 'package', 'describe', '--type', 'json'
standardOutput = stdout
errorOutput = stderr
ignoreExitValue = true
}
def processBuilder = new ProcessBuilder('swift', 'package', 'describe', '--type', 'json')
def process = processBuilder.start()

process.consumeProcessOutput(stdout, stderr)
process.waitFor()

def exitValue = process.exitValue()
def jsonOutput = stdout.toString()

if (result.exitValue == 0) {
if (exitValue == 0) {
def json = new JsonSlurper().parseText(jsonOutput)
def products = json.targets
.findAll { target ->
Expand Down Expand Up @@ -150,6 +150,7 @@ dependencies {
implementation(project(':SwiftKitCore'))
implementation(project(':SwiftKitFFM'))

testRuntimeOnly("org.junit.platform:junit-platform-launcher") // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512 // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand Down
17 changes: 9 additions & 8 deletions Samples/SwiftJavaExtractJNISampleApp/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,24 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

def swiftProductsWithJExtractPlugin() {
def stdout = new ByteArrayOutputStream()
def stderr = new ByteArrayOutputStream()

def result = exec {
commandLine 'swift', 'package', 'describe', '--type', 'json'
standardOutput = stdout
errorOutput = stderr
ignoreExitValue = true
}
def processBuilder = new ProcessBuilder('swift', 'package', 'describe', '--type', 'json')
def process = processBuilder.start()

process.consumeProcessOutput(stdout, stderr)
process.waitFor()

def exitValue = process.exitValue()
def jsonOutput = stdout.toString()

if (result.exitValue == 0) {
if (exitValue == 0) {
def json = new JsonSlurper().parseText(jsonOutput)
def products = json.targets
.findAll { target ->
Expand Down Expand Up @@ -150,6 +150,7 @@ tasks.clean {
dependencies {
implementation(project(':SwiftKitCore'))

testRuntimeOnly("org.junit.platform:junit-platform-launcher") // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand Down
3 changes: 2 additions & 1 deletion SwiftKitCore/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ publishing {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

Expand All @@ -53,6 +53,7 @@ tasks.withType(JavaCompile).configureEach {
}

dependencies {
testRuntimeOnly("org.junit.platform:junit-platform-launcher") // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand Down
3 changes: 2 additions & 1 deletion SwiftKitFFM/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,14 @@ publishing {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

dependencies {
implementation(project(':SwiftKitCore'))

testRuntimeOnly("org.junit.platform:junit-platform-launcher") // TODO: workaround for not finding junit: https://github.com/gradle/gradle/issues/34512
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
Expand Down
2 changes: 1 addition & 1 deletion docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ ENV LANGUAGE=en_US.UTF-8

# JDK dependency
RUN curl -s "https://get.sdkman.io" | bash
RUN bash -c "source /root/.sdkman/bin/sdkman-init.sh && sdk install java 24.0.1-amzn"
RUN bash -c "source /root/.sdkman/bin/sdkman-init.sh && sdk install java 25.0.1-amzn"

RUN curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz && \
tar zxf swiftly-$(uname -m).tar.gz && \
Expand Down
20 changes: 10 additions & 10 deletions docker/install_jdk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
##===----------------------------------------------------------------------===##
set -euo pipefail

# We need JDK 24 because that's the supported version with latest FFM
# We need JDK 25 because that's the supported version with latest FFM
# However, we also need JDK 23 at most because Gradle does not support 24.

# Supported JDKs: corretto
Expand All @@ -36,9 +36,9 @@ download_and_install_jdk() {
if [ "$JDK_VENDOR" = 'corretto' ]; then
if [ "$(uname -m)" = 'aarch64' ]; then
case "$jdk_version" in
"24")
jdk_url="https://corretto.aws/downloads/latest/amazon-corretto-24-aarch64-linux-jdk.tar.gz"
expected_md5="3b543f4e971350b73d0ab6d8174cc030"
"25")
jdk_url="https://corretto.aws/downloads/latest/amazon-corretto-25-aarch64-linux-jdk.tar.gz"
expected_md5="37588d5d2a24b26525b9c563ad65cc77"
;;
*)
echo "Unsupported JDK version: '$jdk_version'"
Expand All @@ -47,9 +47,9 @@ download_and_install_jdk() {
esac
else
case "$jdk_version" in
"24")
jdk_url="https://corretto.aws/downloads/latest/amazon-corretto-24-x64-linux-jdk.tar.gz"
expected_md5="130885ded3cbfc712fbe9f7dace45a52"
"25")
jdk_url="https://corretto.aws/downloads/latest/amazon-corretto-25-x64-linux-jdk.tar.gz"
expected_md5="7e56b1a9d71637ce4dc4047b23d0453e"
;;
*)
echo "Unsupported JDK version: '$jdk_version'"
Expand Down Expand Up @@ -94,12 +94,12 @@ download_and_install_jdk() {
cd "$HOME"
}

# Usage: Install JDK 24
download_and_install_jdk "24"
# Usage: Install JDK 25
download_and_install_jdk "25"

ls -la /usr/lib/jvm/
cd /usr/lib/jvm/
ln -s jdk-24 default-jdk
ln -s jdk-25 default-jdk
find . | grep java | grep bin
echo "JAVA_HOME = /usr/lib/jvm/default-jdk"
/usr/lib/jvm/default-jdk/bin/java -version
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
org.gradle.java.installations.fromEnv=JAVA_HOME_24,JAVA_HOME_24_X64,JAVA_HOME_24_ARM64
org.gradle.java.installations.fromEnv=JAVA_HOME_25,JAVA_HOME_25_X64,JAVA_HOME_25_ARM64
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
Loading