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) } 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 + } }