diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index e621368a..887e889d 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -192,7 +192,7 @@ jobs: swift_version: ['nightly-main'] os_version: ['jammy'] jdk_vendor: ['corretto'] - sdk_triple: ['x86_64-unknown-linux-android28'] + sdk_triple: ['x86_64-unknown-linux-android28', 'armv7-unknown-linux-android28'] ndk_version: ['r27d'] container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} diff --git a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift index 5bbeff4e..65eb703d 100644 --- a/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift +++ b/Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+NativeTranslation.swift @@ -619,11 +619,22 @@ extension JNISwift2JavaGenerator { throw JavaTranslationError.unsupportedSwiftType(swiftResult.type) } - return NativeResult( - javaType: javaType, - conversion: .getJNIValue(.placeholder), - outParameters: [] - ) + if let indirectReturnType = JNIJavaTypeTranslator.indirectConversionStepSwiftType( + for: knownType, + from: knownTypes + ) { + return NativeResult( + javaType: javaType, + conversion: .getJNIValue(.labelessInitializer(.placeholder, swiftType: indirectReturnType)), + outParameters: [] + ) + } else { + return NativeResult( + javaType: javaType, + conversion: .getJNIValue(.placeholder), + outParameters: [] + ) + } } } @@ -902,6 +913,9 @@ extension JNISwift2JavaGenerator { indirect case replacingPlaceholder(NativeSwiftConversionStep, placeholder: NativeSwiftConversionStep) + /// `SwiftType(inner)` + indirect case labelessInitializer(NativeSwiftConversionStep, swiftType: SwiftType) + /// Returns the conversion string applied to the placeholder. func render(_ printer: inout CodePrinter, _ placeholder: String) -> String { // NOTE: 'printer' is used if the conversion wants to cause side-effects. @@ -1396,6 +1410,10 @@ extension JNISwift2JavaGenerator { case .replacingPlaceholder(let inner, let newPlaceholder): let newPlaceholder = newPlaceholder.render(&printer, placeholder) return inner.render(&printer, newPlaceholder) + + case .labelessInitializer(let inner, let swiftType): + let inner = inner.render(&printer, placeholder) + return "\(swiftType)(\(inner))" } } } diff --git a/Tests/JExtractSwiftTests/JNI/JNIIntConversionChecksTests.swift b/Tests/JExtractSwiftTests/JNI/JNIIntConversionChecksTests.swift index c2a61bed..ad00f350 100644 --- a/Tests/JExtractSwiftTests/JNI/JNIIntConversionChecksTests.swift +++ b/Tests/JExtractSwiftTests/JNI/JNIIntConversionChecksTests.swift @@ -152,7 +152,7 @@ struct JNIIntConversionChecksTests { guard let self$ else { fatalError("self memory address was null in call to \\(#function)!") } - return self$.pointee.unsignedInt.getJNIValue(in: environment) + return UInt64(self$.pointee.unsignedInt).getJNIValue(in: environment) """ ] ) @@ -210,7 +210,7 @@ struct JNIIntConversionChecksTests { guard let self$ else { fatalError("self memory address was null in call to \\(#function)!") } - return self$.pointee.dummyFunc(arg: Int(arg$indirect)).getJNIValue(in: environment) + return Int64(self$.pointee.dummyFunc(arg: Int(arg$indirect))).getJNIValue(in: environment) """, ] ) @@ -238,7 +238,7 @@ struct JNIIntConversionChecksTests { guard let self$ else { fatalError("self memory address was null in call to \\(#function)!") } - return self$.pointee.dummyFunc(arg: UInt(arg$indirect)).getJNIValue(in: environment) + return UInt64(self$.pointee.dummyFunc(arg: UInt(arg$indirect))).getJNIValue(in: environment) """, ] )