@@ -59,27 +59,30 @@ struct JNIAsyncTests {
5959 @_cdecl( " Java_com_example_swift_SwiftModule__00024asyncVoid__Ljava_util_concurrent_CompletableFuture_2 " )
6060 func Java_com_example_swift_SwiftModule__00024asyncVoid__Ljava_util_concurrent_CompletableFuture_2(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, result_future: jobject?) {
6161 let globalFuture = environment.interface.NewGlobalRef(environment, result_future)
62- if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
63- Task.immediate {
64- var environment = environment!
65- defer {
66- let deferEnvironment = try! JavaVirtualMachine.shared().environment()
67- environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
62+ var task: Task<Void, Never>? = nil
63+ #if swift(>=6.2)
64+ if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
65+ task = Task.immediate {
66+ var environment = environment!
67+ defer {
68+ let deferEnvironment = try! JavaVirtualMachine.shared().environment()
69+ environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
70+ }
71+ let swiftResult$ = await SwiftModule.asyncVoid()
72+ environment = try! JavaVirtualMachine.shared().environment()
73+ environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
6874 }
69- let swiftResult$ = await SwiftModule.asyncVoid()
70- environment = try JavaVirtualMachine.shared().environment()
71- environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
7275 }
73- }
74- else {
75- Task {
76+ #endif
77+ if task == nil {
78+ task = Task {
7679 var environment = try! JavaVirtualMachine.shared().environment()
7780 defer {
7881 let deferEnvironment = try! JavaVirtualMachine.shared().environment()
7982 environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
8083 }
8184 let swiftResult$ = await SwiftModule.asyncVoid()
82- environment = try JavaVirtualMachine.shared().environment()
85+ environment = try! JavaVirtualMachine.shared().environment()
8386 environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
8487 }
8588 }
@@ -130,35 +133,38 @@ struct JNIAsyncTests {
130133 @_cdecl( " Java_com_example_swift_SwiftModule__00024async__Ljava_util_concurrent_CompletableFuture_2 " )
131134 func Java_com_example_swift_SwiftModule__00024async__Ljava_util_concurrent_CompletableFuture_2(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, result_future: jobject?) {
132135 let globalFuture = environment.interface.NewGlobalRef(environment, result_future)
133- if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
134- Task.immediate {
135- var environment = environment!
136- defer {
137- let deferEnvironment = try! JavaVirtualMachine.shared().environment()
138- environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
139- }
140- do {
141- let swiftResult$ = await try SwiftModule.async()
142- environment = try JavaVirtualMachine.shared().environment()
143- environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
144- }
145- catch {
146- let catchEnvironment = try! JavaVirtualMachine.shared().environment()
147- let exception = catchEnvironment.interface.NewObjectA(catchEnvironment, _JNIMethodIDCache.Exception.class, _JNIMethodIDCache.Exception.constructWithMessage, [String(describing: error).getJValue(in: catchEnvironment)])
148- catchEnvironment.interface.CallBooleanMethodA(catchEnvironment, globalFuture, _JNIMethodIDCache.CompletableFuture.completeExceptionally, [jvalue(l: exception)])
136+ var task: Task<Void, Never>? = nil
137+ #if swift(>=6.2)
138+ if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
139+ task = Task.immediate {
140+ var environment = environment!
141+ defer {
142+ let deferEnvironment = try! JavaVirtualMachine.shared().environment()
143+ environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
144+ }
145+ do {
146+ let swiftResult$ = await try SwiftModule.async()
147+ environment = try! JavaVirtualMachine.shared().environment()
148+ environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
149+ }
150+ catch {
151+ let catchEnvironment = try! JavaVirtualMachine.shared().environment()
152+ let exception = catchEnvironment.interface.NewObjectA(catchEnvironment, _JNIMethodIDCache.Exception.class, _JNIMethodIDCache.Exception.constructWithMessage, [String(describing: error).getJValue(in: catchEnvironment)])
153+ catchEnvironment.interface.CallBooleanMethodA(catchEnvironment, globalFuture, _JNIMethodIDCache.CompletableFuture.completeExceptionally, [jvalue(l: exception)])
154+ }
149155 }
150156 }
151- }
152- else {
153- Task {
157+ #endif
158+ if task == nil {
159+ task = Task {
154160 var environment = try! JavaVirtualMachine.shared().environment()
155161 defer {
156162 let deferEnvironment = try! JavaVirtualMachine.shared().environment()
157163 environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
158164 }
159165 do {
160166 let swiftResult$ = await try SwiftModule.async()
161- environment = try JavaVirtualMachine.shared().environment()
167+ environment = try! JavaVirtualMachine.shared().environment()
162168 environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: nil)])
163169 }
164170 catch {
@@ -215,28 +221,31 @@ struct JNIAsyncTests {
215221 @_cdecl( " Java_com_example_swift_SwiftModule__00024async__JLjava_util_concurrent_CompletableFuture_2 " )
216222 func Java_com_example_swift_SwiftModule__00024async__JLjava_util_concurrent_CompletableFuture_2(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, i: jlong, result_future: jobject?) {
217223 let globalFuture = environment.interface.NewGlobalRef(environment, result_future)
224+ var task: Task<Void, Never>? = nil
225+ #if swift(>=6.2)
218226 if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
219- Task.immediate {
227+ task = Task.immediate {
220228 var environment = environment!
221229 defer {
222230 let deferEnvironment = try! JavaVirtualMachine.shared().environment()
223231 environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
224232 }
225233 let swiftResult$ = await SwiftModule.async(i: Int64(fromJNI: i, in: environment))
226- environment = try JavaVirtualMachine.shared().environment()
234+ environment = try! JavaVirtualMachine.shared().environment()
227235 let boxedResult$ = SwiftJavaRuntimeSupport._JNIBoxedConversions.box(swiftResult$.getJNIValue(in: environment), in: environment)
228236 environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: boxedResult$)])
229237 }
230238 }
231- else {
232- Task {
239+ #endif // end of swift(>=6.2)
240+ if task == nil {
241+ task = Task {
233242 var environment = try! JavaVirtualMachine.shared().environment()
234243 defer {
235244 let deferEnvironment = try! JavaVirtualMachine.shared().environment()
236245 environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
237246 }
238247 let swiftResult$ = await SwiftModule.async(i: Int64(fromJNI: i, in: environment))
239- environment = try JavaVirtualMachine.shared().environment()
248+ environment = try! JavaVirtualMachine.shared().environment()
240249 let boxedResult$ = SwiftJavaRuntimeSupport._JNIBoxedConversions.box(swiftResult$.getJNIValue(in: environment), in: environment)
241250 environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: boxedResult$)])
242251 }
@@ -303,31 +312,34 @@ struct JNIAsyncTests {
303312 fatalError( " c memory address was null in call to \\ (#function)! " )
304313 }
305314 let globalFuture = environment.interface.NewGlobalRef(environment, result_future)
306- if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
307- Task.immediate {
308- var environment = environment!
309- defer {
310- let deferEnvironment = try! JavaVirtualMachine.shared().environment()
311- environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
315+ var task: Task<Void, Never>? = nil
316+ #if swift(>=6.2)
317+ if #available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *) {
318+ task = Task.immediate {
319+ var environment = environment!
320+ defer {
321+ let deferEnvironment = try! JavaVirtualMachine.shared().environment()
322+ environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
323+ }
324+ let swiftResult$ = await SwiftModule.async(c: c$.pointee)
325+ environment = try! JavaVirtualMachine.shared().environment()
326+ let result$ = UnsafeMutablePointer<MyClass>.allocate(capacity: 1)
327+ result$.initialize(to: swiftResult$)
328+ let resultBits$ = Int64(Int(bitPattern: result$))
329+ let boxedResult$ = SwiftJavaRuntimeSupport._JNIBoxedConversions.box(resultBits$.getJNIValue(in: environment), in: environment)
330+ environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: boxedResult$)])
312331 }
313- let swiftResult$ = await SwiftModule.async(c: c$.pointee)
314- environment = try JavaVirtualMachine.shared().environment()
315- let result$ = UnsafeMutablePointer<MyClass>.allocate(capacity: 1)
316- result$.initialize(to: swiftResult$)
317- let resultBits$ = Int64(Int(bitPattern: result$))
318- let boxedResult$ = SwiftJavaRuntimeSupport._JNIBoxedConversions.box(resultBits$.getJNIValue(in: environment), in: environment)
319- environment.interface.CallBooleanMethodA(environment, globalFuture, _JNIMethodIDCache.CompletableFuture.complete, [jvalue(l: boxedResult$)])
320332 }
321- }
322- else {
323- Task {
333+ #endif
334+ if task == nil {
335+ task = Task {
324336 var environment = try! JavaVirtualMachine.shared().environment()
325337 defer {
326338 let deferEnvironment = try! JavaVirtualMachine.shared().environment()
327339 environment.interface.DeleteGlobalRef(deferEnvironment, globalFuture)
328340 }
329341 let swiftResult$ = await SwiftModule.async(c: c$.pointee)
330- environment = try JavaVirtualMachine.shared().environment()
342+ environment = try! JavaVirtualMachine.shared().environment()
331343 let result$ = UnsafeMutablePointer<MyClass>.allocate(capacity: 1)
332344 result$.initialize(to: swiftResult$)
333345 let resultBits$ = Int64(Int(bitPattern: result$))
0 commit comments