From e8851442182a05be7efc9693c18a356af16bad6a Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Sat, 6 Dec 2025 16:37:29 +0100 Subject: [PATCH 1/2] fix protocol threading --- Sources/SwiftJava/JavaObject+Inheritance.swift | 5 +++-- .../generated/JavaJNISwiftInstance.swift | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Sources/SwiftJava/JavaObject+Inheritance.swift b/Sources/SwiftJava/JavaObject+Inheritance.swift index 0ddd79449..d4482fc2f 100644 --- a/Sources/SwiftJava/JavaObject+Inheritance.swift +++ b/Sources/SwiftJava/JavaObject+Inheritance.swift @@ -25,9 +25,10 @@ extension AnyJavaObject { guard let this: jobject = javaThisOptional else { return nil } + let environment = try! JavaVirtualMachine.shared().environment() - return try? otherClass.withJNIClass(in: javaEnvironment) { otherJavaClass in - if javaEnvironment.interface.IsInstanceOf(javaEnvironment, this, otherJavaClass) == 0 { + return try? otherClass.withJNIClass(in: environment) { otherJavaClass in + if environment.interface.IsInstanceOf(environment, this, otherJavaClass) == 0 { return nil } diff --git a/Sources/SwiftJavaRuntimeSupport/generated/JavaJNISwiftInstance.swift b/Sources/SwiftJavaRuntimeSupport/generated/JavaJNISwiftInstance.swift index 4040d0bcb..fe413d505 100644 --- a/Sources/SwiftJavaRuntimeSupport/generated/JavaJNISwiftInstance.swift +++ b/Sources/SwiftJavaRuntimeSupport/generated/JavaJNISwiftInstance.swift @@ -15,7 +15,11 @@ import SwiftJava @JavaInterface("org.swift.swiftkit.core.JNISwiftInstance") -public struct JavaJNISwiftInstance { +public struct JavaJNISwiftInstance: AnyJavaObjectWithCustomClassLoader { @JavaMethod("$memoryAddress") public func memoryAddress() -> Int64 + + public static func getJavaClassLoader(in environment: JNIEnvironment) throws -> JavaClassLoader! { + JNI.shared.applicationClassLoader + } } From 49ba299daee6df36408aa5c66bdc4df48010c9de Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Sat, 6 Dec 2025 17:19:27 +0100 Subject: [PATCH 2/2] fallback --- Sources/SwiftJava/AnyJavaObject.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Sources/SwiftJava/AnyJavaObject.swift b/Sources/SwiftJava/AnyJavaObject.swift index 33a83159c..ef0832b92 100644 --- a/Sources/SwiftJava/AnyJavaObject.swift +++ b/Sources/SwiftJava/AnyJavaObject.swift @@ -110,10 +110,10 @@ extension AnyJavaObject { private static func _withJNIClassFromCustomClassLoader( _ classLoader: JavaClassLoader, in environment: JNIEnvironment, - _ body: (jclass) throws -> Result + _ body: (jclass?) throws -> Result ) throws -> Result { - let resolvedClass = try classLoader.findClass(fullJavaClassName) - return try body(resolvedClass!.javaThis) + let resolvedClass = try? classLoader.findClass(fullJavaClassName) + return try body(resolvedClass?.javaThis) } /// Retrieve the Java class for this type and execute body(). @@ -124,7 +124,14 @@ extension AnyJavaObject { ) throws -> Result { if let AnyJavaObjectWithCustomClassLoader = self as? AnyJavaObjectWithCustomClassLoader.Type, let customClassLoader = try AnyJavaObjectWithCustomClassLoader.getJavaClassLoader(in: environment) { - try _withJNIClassFromCustomClassLoader(customClassLoader, in: environment, body) + try _withJNIClassFromCustomClassLoader(customClassLoader, in: environment) { clazz in + guard let clazz else { + // If the custom class loader did not find the class + // let's look in the default class loader. + return try _withJNIClassFromDefaultClassLoader(in: environment, body) + } + return try body(clazz) + } } else { try _withJNIClassFromDefaultClassLoader(in: environment, body) }