Skip to content

Improve lookup of JavaClass instances in an environment #49

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 7, 2024
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
12 changes: 7 additions & 5 deletions Sources/JavaKit/AnyJavaObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,12 @@ extension AnyJavaObject {
}

/// Retrieve the Java class for this type.
public static func getJNIClass(in environment: JNIEnvironment) -> jclass? {
return environment.interface.FindClass(
environment,
fullJavaClassNameWithSlashes
)
public static func getJNIClass(in environment: JNIEnvironment) throws -> jclass {
try environment.translatingJNIExceptions {
environment.interface.FindClass(
environment,
fullJavaClassNameWithSlashes
)
}!
}
}
2 changes: 1 addition & 1 deletion Sources/JavaKit/Exceptions/ExceptionHandling.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extension JNIEnvironment {
// Otherwise, create a exception with a message.
_ = interface.ThrowNew(
self,
JavaClass<Exception>.getJNIClass(in: self),
try! JavaClass<Exception>.getJNIClass(in: self),
String(describing: error)
)
}
Expand Down
10 changes: 9 additions & 1 deletion Sources/JavaKit/JavaClass.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,12 @@ import JavaRuntime
/// Wrapper around a Java class that provides access to the static members of
/// the class.
@JavaClass("java.lang.Class")
public struct JavaClass<ObjectType: AnyJavaObject> { }
public struct JavaClass<ObjectType: AnyJavaObject> {
/// Lookup this Java class within the given environment.
public init(in environment: JNIEnvironment) throws {
self.init(
javaThis: try ObjectType.getJNIClass(in: environment),
environment: environment
)
}
}
2 changes: 1 addition & 1 deletion Sources/JavaKit/JavaObject+Inheritance.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ extension AnyJavaObject {
private func isInstanceOf<OtherClass: AnyJavaObject>(
_ otherClass: OtherClass.Type
) -> jclass? {
guard let otherJavaClass = otherClass.getJNIClass(in: javaEnvironment) else {
guard let otherJavaClass = try? otherClass.getJNIClass(in: javaEnvironment) else {
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/JavaKit/JavaObject+MethodCalls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ extension AnyJavaObject {
in environment: JNIEnvironment,
arguments: repeat each Param
) throws -> Self {
let thisClass = Self.getJNIClass(in: environment)!
let thisClass = try Self.getJNIClass(in: environment)

// Compute the method signature so we can find the right method, then look up the
// method within the class.
Expand Down
2 changes: 1 addition & 1 deletion Sources/JavaKit/Optional+JavaObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ extension Optional: JavaValue where Wrapped: AnyJavaObject {

public static func jniNewArray(in environment: JNIEnvironment) -> JNINewArray {
return { environment, size in
let jniClass = Wrapped.getJNIClass(in: environment)
let jniClass = try! Wrapped.getJNIClass(in: environment)
return environment.interface.NewObjectArray(environment, size, jniClass, nil)
}
}
Expand Down
20 changes: 14 additions & 6 deletions Tests/JavaKitTests/BasicRuntimeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,24 @@ struct BasicRuntimeTests {
}

@Test("Static methods")
func staticMethods() {
let urlConnectionClass = JavaClass<URLConnection>(
javaThis: URLConnection.getJNIClass(in: jvm.environment)!,
environment: jvm.environment
)

func staticMethods() throws {
let urlConnectionClass = try JavaClass<URLConnection>(in: jvm.environment)
#expect(urlConnectionClass.getDefaultAllowUserInteraction() == false)
}

@Test("Class instance lookup")
func classInstanceLookup() throws {
do {
_ = try JavaClass<Nonexistent>(in: jvm.environment)
} catch {
#expect(String(describing: error) == "org/swift/javakit/Nonexistent")
}
}
}

@JavaClass("org.swift.javakit.Nonexistent")
struct Nonexistent { }

/// Whether we're running on Linux.
var isLinux: Bool {
#if os(Linux)
Expand Down
Loading