From 4fa32a1971d204d30b5fe805d0805367b45a2fe8 Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Thu, 7 Nov 2024 15:57:16 +1100 Subject: [PATCH] JavaKit: map NULL jstring to the empty string There's an impedance mismatch here between the JNIType (which is optional) and the Swift type. Assuming this is intentional than init(fromJNI:in) should check for a NULL value and map it to the empty string. Fixes: #155 --- Sources/JavaKit/BridgedValues/JavaValue+String.swift | 4 ++++ Tests/JavaKitTests/BasicRuntimeTests.swift | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/Sources/JavaKit/BridgedValues/JavaValue+String.swift b/Sources/JavaKit/BridgedValues/JavaValue+String.swift index e9c11e64..5e98634d 100644 --- a/Sources/JavaKit/BridgedValues/JavaValue+String.swift +++ b/Sources/JavaKit/BridgedValues/JavaValue+String.swift @@ -24,6 +24,10 @@ extension String: JavaValue { } public init(fromJNI value: JNIType, in environment: JNIEnvironment) { + guard let value else { + self.init() + return + } let cString = environment.interface.GetStringUTFChars(environment, value, nil)! defer { environment.interface.ReleaseStringUTFChars(environment, value, cString) } self = String(cString: cString) diff --git a/Tests/JavaKitTests/BasicRuntimeTests.swift b/Tests/JavaKitTests/BasicRuntimeTests.swift index e417cd6d..1cb0e787 100644 --- a/Tests/JavaKitTests/BasicRuntimeTests.swift +++ b/Tests/JavaKitTests/BasicRuntimeTests.swift @@ -76,6 +76,12 @@ class BasicRuntimeTests: XCTestCase { XCTAssertEqual(String(describing: error), "org/swift/javakit/Nonexistent") } } + + func testNullJavaStringConversion() throws { + let environment = try jvm.environment() + let nullString = String(fromJNI: nil, in: environment) + XCTAssertEqual(nullString, "") + } } @JavaClass("org.swift.javakit.Nonexistent")