From 5c2ff493b0d87d9e6b834154a3c1ff7b52a7818d Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Tue, 9 Dec 2025 14:49:40 +0100 Subject: [PATCH 1/5] use arenas instead --- .../java/com/example/swift/ProtocolTest.java | 2 +- ...Generator+InterfaceWrapperGeneration.swift | 4 ++- ...t2JavaGenerator+JavaBindingsPrinting.swift | 10 +------ ...ISwift2JavaGenerator+JavaTranslation.swift | 4 +++ ...ift2JavaGenerator+SwiftThunkPrinting.swift | 21 ++++++++++--- Sources/SwiftJavaRuntimeSupport/JNI.swift | 30 ++++++++++++++++--- .../generated/JavaSwiftArena.swift | 18 +++++++++++ .../SwiftJavaRuntimeSupport/swift-java.config | 6 ++++ 8 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 Sources/SwiftJavaRuntimeSupport/generated/JavaSwiftArena.swift create mode 100644 Sources/SwiftJavaRuntimeSupport/swift-java.config diff --git a/Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/ProtocolTest.java b/Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/ProtocolTest.java index b8159b8ad..42683ac96 100644 --- a/Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/ProtocolTest.java +++ b/Samples/SwiftJavaExtractJNISampleApp/src/test/java/com/example/swift/ProtocolTest.java @@ -77,7 +77,7 @@ void protocolMethod() { void protocolClassMethod() { try (var arena = SwiftArena.ofConfined()) { ProtocolA proto1 = ConcreteProtocolAB.init(10, 5, arena); - assertEquals(10, proto1.makeClass().getX()); + assertEquals(10, proto1.makeClass(arena).getX()); } } diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift index abf67f3e3..e5ba671d8 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift @@ -42,6 +42,7 @@ extension JNISwift2JavaGenerator { let protocolType: SwiftNominalType let functions: [Function] let variables: [Variable] + let importedType: ImportedNominalType var wrapperName: String { protocolType.nominalTypeDecl.javaInterfaceSwiftProtocolWrapperName @@ -99,7 +100,8 @@ extension JNISwift2JavaGenerator { return JavaInterfaceSwiftWrapper( protocolType: SwiftNominalType(nominalTypeDecl: type.swiftNominal), functions: functions, - variables: variables + variables: variables, + importedType: type ) } diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift index bfa2ff12d..d6fe7017c 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift @@ -531,17 +531,9 @@ extension JNISwift2JavaGenerator { // If we have enabled javaCallbacks we must emit default // arena methods for protocols, as this is what // Swift will call into, when you call a interface from Swift. - let shouldGenerateGlobalArenaVariation: Bool + let shouldGenerateGlobalArenaVariation = config.effectiveMemoryManagementMode.requiresGlobalArena && translatedSignature.requiresSwiftArena let isParentProtocol = importedFunc?.parentType?.asNominalType?.isProtocol ?? false - if config.effectiveMemoryManagementMode.requiresGlobalArena && translatedSignature.requiresSwiftArena { - shouldGenerateGlobalArenaVariation = true - } else if isParentProtocol, translatedSignature.requiresSwiftArena, config.effectiveEnableJavaCallbacks { - shouldGenerateGlobalArenaVariation = true - } else { - shouldGenerateGlobalArenaVariation = false - } - if shouldGenerateGlobalArenaVariation { if let importedFunc { printDeclDocumentation(&printer, importedFunc) diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift index a9369ccd7..c6f9713ba 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift @@ -1317,5 +1317,9 @@ extension JNISwift2JavaGenerator { // FIXME: Remove once we support protocol variables case protocolVariablesNotSupported + + /// We cannot generate interface wrappers for + /// protocols that we unable to be jextracted. + case protocolWasNotExtracted } } diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift index 99bd3dff0..06ba65e95 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift @@ -124,9 +124,9 @@ extension JNISwift2JavaGenerator { printer.print("var \(translatedWrapper.javaInterfaceVariableName): \(translatedWrapper.javaInterfaceName) { get }") } printer.println() - printer.printBraceBlock("extension \(translatedWrapper.wrapperName)") { printer in + try printer.printBraceBlock("extension \(translatedWrapper.wrapperName)") { printer in for function in translatedWrapper.functions { - printInterfaceWrapperFunctionImpl(&printer, function, inside: translatedWrapper) + try printInterfaceWrapperFunctionImpl(&printer, function, inside: translatedWrapper) printer.println() } @@ -142,9 +142,16 @@ extension JNISwift2JavaGenerator { _ printer: inout CodePrinter, _ function: JavaInterfaceSwiftWrapper.Function, inside wrapper: JavaInterfaceSwiftWrapper - ) { + ) throws { + guard let protocolMethod = wrapper.importedType.methods.first(where: { $0.functionSignature == function.originalFunctionSignature }) else { + fatalError("Failed to find protocol method") + } + guard let translatedDecl = self.translatedDecl(for: protocolMethod) else { + throw JavaTranslationError.protocolWasNotExtracted + } + printer.printBraceBlock(function.swiftDecl.signatureString) { printer in - let upcallArguments = zip( + var upcallArguments = zip( function.originalFunctionSignature.parameters, function.parameterConversions ).map { param, conversion in @@ -152,6 +159,12 @@ extension JNISwift2JavaGenerator { conversion.render(&printer, param.parameterName!) } + // If the underlying translated method requires + // a SwiftArena, we pass in the global arena + if translatedDecl.translatedFunctionSignature.requiresSwiftArena { + upcallArguments.append("JNI.shared.globalArena") + } + let tryClause = function.originalFunctionSignature.isThrowing ? "try " : "" let javaUpcall = "\(tryClause)\(wrapper.javaInterfaceVariableName).\(function.swiftFunctionName)(\(upcallArguments.joined(separator: ", ")))" diff --git a/Sources/SwiftJavaRuntimeSupport/JNI.swift b/Sources/SwiftJavaRuntimeSupport/JNI.swift index b6f0117df..20704d706 100644 --- a/Sources/SwiftJavaRuntimeSupport/JNI.swift +++ b/Sources/SwiftJavaRuntimeSupport/JNI.swift @@ -15,13 +15,28 @@ import SwiftJava import CSwiftJavaJNI -final class JNI { - static var shared: JNI! +public final class JNI { + public fileprivate(set) static var shared: JNI! - let applicationClassLoader: JavaClassLoader + public let applicationClassLoader: JavaClassLoader + public let globalArena: JavaSwiftArena init(fromVM javaVM: JavaVirtualMachine) { - self.applicationClassLoader = try! JavaClass(environment: javaVM.environment()).currentThread().getContextClassLoader() + let environment = try! javaVM.environment() + + self.applicationClassLoader = try! JavaClass(environment: environment).currentThread().getContextClassLoader() + + // Find global arena + let swiftMemoryClass = environment.interface.FindClass(environment, "org/swift/swiftkit/core/SwiftMemoryManagement")! + let arenaFieldID = environment.interface.GetStaticFieldID( + environment, + swiftMemoryClass, + "GLOBAL_SWIFT_JAVA_ARENA", + "Lorg/swift/swiftkit/core/SwiftArena;" + ) + let localObject = environment.interface.GetStaticObjectField(environment, swiftMemoryClass, arenaFieldID)! + self.globalArena = JavaSwiftArena(javaThis: localObject, environment: environment) + environment.interface.DeleteLocalRef(environment, localObject) } } @@ -29,3 +44,10 @@ final class JNI { public func _JNI_OnLoad(_ javaVM: JavaVMPointer, _ reserved: UnsafeMutableRawPointer) { JNI.shared = JNI(fromVM: JavaVirtualMachine(adoptingJVM: javaVM)) } + +public protocol ApplicationClassLoadable: AnyJavaObjectWithCustomClassLoader {} +extension ApplicationClassLoadable { + public static func getJavaClassLoader(in environment: JNIEnvironment) throws -> JavaClassLoader! { + JNI.shared.applicationClassLoader + } +} diff --git a/Sources/SwiftJavaRuntimeSupport/generated/JavaSwiftArena.swift b/Sources/SwiftJavaRuntimeSupport/generated/JavaSwiftArena.swift new file mode 100644 index 000000000..98abbe0b0 --- /dev/null +++ b/Sources/SwiftJavaRuntimeSupport/generated/JavaSwiftArena.swift @@ -0,0 +1,18 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import SwiftJava + +@JavaInterface("org.swift.swiftkit.core.SwiftArena") +public struct JavaSwiftArena {} diff --git a/Sources/SwiftJavaRuntimeSupport/swift-java.config b/Sources/SwiftJavaRuntimeSupport/swift-java.config new file mode 100644 index 000000000..859a7407e --- /dev/null +++ b/Sources/SwiftJavaRuntimeSupport/swift-java.config @@ -0,0 +1,6 @@ +{ + "classes" : { + "org.swift.swiftkit.core.JNISwiftInstance" : "JavaJNISwiftInstance", + "org.swift.swiftkit.core.SwiftArena" : "JavaSwiftArena" + } +} From 112d1b72fde2f42960d3b0dd13b6f4751fbd267c Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Wed, 10 Dec 2025 08:13:01 +0100 Subject: [PATCH 2/5] remove temp code --- Sources/SwiftJavaRuntimeSupport/JNI.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Sources/SwiftJavaRuntimeSupport/JNI.swift b/Sources/SwiftJavaRuntimeSupport/JNI.swift index 20704d706..7c4a52d0a 100644 --- a/Sources/SwiftJavaRuntimeSupport/JNI.swift +++ b/Sources/SwiftJavaRuntimeSupport/JNI.swift @@ -44,10 +44,3 @@ public final class JNI { public func _JNI_OnLoad(_ javaVM: JavaVMPointer, _ reserved: UnsafeMutableRawPointer) { JNI.shared = JNI(fromVM: JavaVirtualMachine(adoptingJVM: javaVM)) } - -public protocol ApplicationClassLoadable: AnyJavaObjectWithCustomClassLoader {} -extension ApplicationClassLoadable { - public static func getJavaClassLoader(in environment: JNIEnvironment) throws -> JavaClassLoader! { - JNI.shared.applicationClassLoader - } -} From 0e346802054ec997116f9e280c0dfdd8ec5ca424 Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Wed, 10 Dec 2025 08:17:24 +0100 Subject: [PATCH 3/5] fix test --- .../JNI/JNIProtocolTests.swift | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift b/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift index 3b47fd100..f91422f15 100644 --- a/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift +++ b/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift @@ -70,28 +70,6 @@ struct JNIProtocolTests { ]) } - @Test - func emitsDefault() throws { - try assertOutput( - input: source, - config: config, - .jni, .java, - detectChunkByInitialLines: 1, - expectedChunks: [ - """ - public interface SomeProtocol { - ... - public default SomeClass withObject(SomeClass c) { - return withObject(c, SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); - } - ... - public SomeClass withObject(SomeClass c, SwiftArena swiftArena$); - ... - } - """ - ]) - } - @Test func generatesJavaClassWithExtends() throws { try assertOutput( @@ -329,7 +307,7 @@ struct JNIProtocolTests { let cClass = try! JavaClass(environment: JavaVirtualMachine.shared().environment()) let cPointer = UnsafeMutablePointer.allocate(capacity: 1) cPointer.initialize(to: c) - guard let unwrapped$ = _javaSomeProtocolInterface.withObject(cClass.wrapMemoryAddressUnsafe(Int64(Int(bitPattern: cPointer)))) else { + guard let unwrapped$ = _javaSomeProtocolInterface.withObject(cClass.wrapMemoryAddressUnsafe(Int64(Int(bitPattern: cPointer))), JNI.shared.globalArena) else { fatalError("Upcall to withObject unexpectedly returned nil") } let result$MemoryAddress$ = unwrapped$.as(JavaJNISwiftInstance.self)!.memoryAddress() From 248d6c6520498d037d99c0f798190f586a8fb911 Mon Sep 17 00:00:00 2001 From: Mads Odgaard Date: Wed, 10 Dec 2025 11:16:45 +0100 Subject: [PATCH 4/5] PR feedback --- ...ft2JavaGenerator+JavaBindingsPrinting.swift | 4 ++-- ...wift2JavaGenerator+SwiftThunkPrinting.swift | 2 +- Sources/SwiftJava/AnyJavaObject.swift | 5 +++++ Sources/SwiftJavaRuntimeSupport/JNI.swift | 18 ++++++++++++++---- .../swiftkit/core/SwiftMemoryManagement.java | 2 +- .../JNI/JNIProtocolTests.swift | 2 +- .../MemoryManagementModeTests.swift | 4 ++-- 7 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift index d6fe7017c..78c91376d 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift @@ -214,7 +214,7 @@ extension JNISwift2JavaGenerator { } public static \(decl.swiftNominal.name) wrapMemoryAddressUnsafe(long selfPointer) { - return new \(decl.swiftNominal.name)(selfPointer, SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); + return new \(decl.swiftNominal.name)(selfPointer, SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA); } """ ) @@ -546,7 +546,7 @@ extension JNISwift2JavaGenerator { } printer.printBraceBlock("\(annotationsStr)\(modifiers.joined(separator: " ")) \(resultType) \(translatedDecl.name)(\(parametersStr))\(throwsClause)") { printer in - let globalArenaName = "SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA" + let globalArenaName = "SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA" let arguments = translatedDecl.translatedFunctionSignature.parameters.map(\.parameter.name) + [globalArenaName] let call = "\(translatedDecl.name)(\(arguments.joined(separator: ", ")))" if translatedDecl.translatedFunctionSignature.resultType.javaType.isVoid { diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift index 06ba65e95..6bd5cac69 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+SwiftThunkPrinting.swift @@ -162,7 +162,7 @@ extension JNISwift2JavaGenerator { // If the underlying translated method requires // a SwiftArena, we pass in the global arena if translatedDecl.translatedFunctionSignature.requiresSwiftArena { - upcallArguments.append("JNI.shared.globalArena") + upcallArguments.append("JNI.shared.defaultAutoArena") } let tryClause = function.originalFunctionSignature.isThrowing ? "try " : "" diff --git a/Sources/SwiftJava/AnyJavaObject.swift b/Sources/SwiftJava/AnyJavaObject.swift index ef0832b92..1db0699dc 100644 --- a/Sources/SwiftJava/AnyJavaObject.swift +++ b/Sources/SwiftJava/AnyJavaObject.swift @@ -77,6 +77,11 @@ extension AnyJavaObject { return String(seq) } + /// The mangled name for this java class + public static var mangledName: String { + "L\(fullJavaClassNameWithSlashes);" + } + /// Initialize a Java object from its instance. public init(javaThis: jobject, environment: JNIEnvironment) { self.init(javaHolder: JavaObjectHolder(object: javaThis, environment: environment)) diff --git a/Sources/SwiftJavaRuntimeSupport/JNI.swift b/Sources/SwiftJavaRuntimeSupport/JNI.swift index 7c4a52d0a..4eac2242b 100644 --- a/Sources/SwiftJavaRuntimeSupport/JNI.swift +++ b/Sources/SwiftJavaRuntimeSupport/JNI.swift @@ -15,11 +15,21 @@ import SwiftJava import CSwiftJavaJNI +/// A type that represents the shared JNI environment +/// used to share any global JNI variables. +/// +/// This is initialized when the `JNI_OnLoad` is triggered, +/// which happens when you call `System.loadLibrary(...)` +/// from Java. public final class JNI { + /// The shared JNI object, initialized by `JNI_OnLoad` public fileprivate(set) static var shared: JNI! + /// The default application class loader public let applicationClassLoader: JavaClassLoader - public let globalArena: JavaSwiftArena + + /// The default auto arena of SwiftKitCore + public let defaultAutoArena: JavaSwiftArena init(fromVM javaVM: JavaVirtualMachine) { let environment = try! javaVM.environment() @@ -31,11 +41,11 @@ public final class JNI { let arenaFieldID = environment.interface.GetStaticFieldID( environment, swiftMemoryClass, - "GLOBAL_SWIFT_JAVA_ARENA", - "Lorg/swift/swiftkit/core/SwiftArena;" + "DEFAULT_SWIFT_JAVA_AUTO_ARENA", + JavaSwiftArena.mangledName ) let localObject = environment.interface.GetStaticObjectField(environment, swiftMemoryClass, arenaFieldID)! - self.globalArena = JavaSwiftArena(javaThis: localObject, environment: environment) + self.defaultAutoArena = JavaSwiftArena(javaThis: localObject, environment: environment) environment.interface.DeleteLocalRef(environment, localObject) } } diff --git a/SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftMemoryManagement.java b/SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftMemoryManagement.java index 2b9a12092..529bec42e 100644 --- a/SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftMemoryManagement.java +++ b/SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftMemoryManagement.java @@ -15,5 +15,5 @@ package org.swift.swiftkit.core; public class SwiftMemoryManagement { - public static final SwiftArena GLOBAL_SWIFT_JAVA_ARENA = SwiftArena.ofAuto(); + public static final SwiftArena DEFAULT_SWIFT_JAVA_AUTO_ARENA = SwiftArena.ofAuto(); } diff --git a/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift b/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift index f91422f15..a15fdb2d1 100644 --- a/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift +++ b/Tests/JExtractSwiftTests/JNI/JNIProtocolTests.swift @@ -307,7 +307,7 @@ struct JNIProtocolTests { let cClass = try! JavaClass(environment: JavaVirtualMachine.shared().environment()) let cPointer = UnsafeMutablePointer.allocate(capacity: 1) cPointer.initialize(to: c) - guard let unwrapped$ = _javaSomeProtocolInterface.withObject(cClass.wrapMemoryAddressUnsafe(Int64(Int(bitPattern: cPointer))), JNI.shared.globalArena) else { + guard let unwrapped$ = _javaSomeProtocolInterface.withObject(cClass.wrapMemoryAddressUnsafe(Int64(Int(bitPattern: cPointer))), JNI.shared.defaultAutoArena) else { fatalError("Upcall to withObject unexpectedly returned nil") } let result$MemoryAddress$ = unwrapped$.as(JavaJNISwiftInstance.self)!.memoryAddress() diff --git a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift index 2228aad88..9d5d5fcae 100644 --- a/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift +++ b/Tests/JExtractSwiftTests/MemoryManagementModeTests.swift @@ -63,7 +63,7 @@ struct MemoryManagementModeTests { expectedChunks: [ """ public static MyClass f() { - return f(SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); + return f(SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA); } """, """ @@ -95,7 +95,7 @@ struct MemoryManagementModeTests { expectedChunks: [ """ public default MyClass f() { - return f(SwiftMemoryManagement.GLOBAL_SWIFT_JAVA_ARENA); + return f(SwiftMemoryManagement.DEFAULT_SWIFT_JAVA_AUTO_ARENA); } """, """ From 5b83c088e70b3487ae8cc943b4a4ee7b0d46b7f0 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Wed, 10 Dec 2025 19:23:37 +0900 Subject: [PATCH 5/5] Apply suggestions from code review --- Sources/SwiftJava/AnyJavaObject.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/SwiftJava/AnyJavaObject.swift b/Sources/SwiftJava/AnyJavaObject.swift index 1db0699dc..dd32ef34d 100644 --- a/Sources/SwiftJava/AnyJavaObject.swift +++ b/Sources/SwiftJava/AnyJavaObject.swift @@ -77,7 +77,7 @@ extension AnyJavaObject { return String(seq) } - /// The mangled name for this java class + /// The mangled name for this java class public static var mangledName: String { "L\(fullJavaClassNameWithSlashes);" }