From f1c984e6f12515ac4c0e6d97d9010c84562ca4d6 Mon Sep 17 00:00:00 2001 From: Iceman Date: Mon, 9 Feb 2026 10:49:12 +0900 Subject: [PATCH 1/2] JavaInterfaceProtocolWrapper also ignores static requirements --- .../MySwiftLibrary/ProtocolWithStatic.swift | 15 ++++++++++++++- ...JavaGenerator+InterfaceWrapperGeneration.swift | 6 ++++++ .../JNISwift2JavaGenerator+JavaTranslation.swift | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/ProtocolWithStatic.swift b/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/ProtocolWithStatic.swift index 9936646a..f565b1c6 100644 --- a/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/ProtocolWithStatic.swift +++ b/Samples/SwiftJavaExtractJNISampleApp/Sources/MySwiftLibrary/ProtocolWithStatic.swift @@ -15,6 +15,19 @@ public protocol ProtocolWithStatic { // static requirements are not yet supported. static func myFunc() -> Int - static var value: Int64 { get } init() } + +public func useProtocolWithStatic(_ value: any ProtocolWithStatic) -> Int { + let meta = type(of: value) + return meta.myFunc() +} + +public protocol ProtocolWithStaticProperty { + static var value: Int { get } +} + +public func useProtocolWithStaticProperty(_ value: any ProtocolWithStaticProperty) -> Int { + let meta = type(of: value) + return meta.value +} diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift index e5ba671d..18f9b5de 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift @@ -78,6 +78,12 @@ extension JNISwift2JavaGenerator { struct JavaInterfaceProtocolWrapperGenerator { func generate(for type: ImportedNominalType) throws -> JavaInterfaceSwiftWrapper { + if !type.initializers.isEmpty + || type.methods.contains(where: \.isStatic) + || type.variables.contains(where: \.isStatic) { + throw JavaTranslationError.protocolStaticRequirementsNotSupported + } + let functions = try type.methods.map { method in try translate(function: method) } diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift index 1c791df0..a1565123 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift @@ -1369,6 +1369,8 @@ extension JNISwift2JavaGenerator { // FIXME: Remove once we support protocol variables case protocolVariablesNotSupported + case protocolStaticRequirementsNotSupported + /// We cannot generate interface wrappers for /// protocols that we unable to be jextracted. case protocolWasNotExtracted From e1629ac069a6f86ef0c20f7200e6c8781e00a5f3 Mon Sep 17 00:00:00 2001 From: Iceman Date: Mon, 9 Feb 2026 15:07:09 +0900 Subject: [PATCH 2/2] Skip interface protocol generation except protocol --- .../JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift index 18f9b5de..a7e968e9 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+InterfaceWrapperGeneration.swift @@ -23,7 +23,7 @@ extension JNISwift2JavaGenerator { ) -> [ImportedNominalType: JavaInterfaceSwiftWrapper] { var wrappers = [ImportedNominalType: JavaInterfaceSwiftWrapper]() - for type in types { + for type in types where type.swiftNominal.kind == .protocol { do { let translator = JavaInterfaceProtocolWrapperGenerator() wrappers[type] = try translator.generate(for: type)