Skip to content

Commit ccc87db

Browse files
authored
add support for strings (#273)
1 parent 660acb7 commit ccc87db

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ extension JNISwift2JavaGenerator {
134134
"""
135135
) { printer in
136136
let downcallParameters = zip(decl.functionSignature.parameters, translatedParameters).map { originalParam, translatedParam in
137-
let label = originalParam.argumentLabel ?? originalParam.parameterName ?? ""
138-
return "\(label)\(!label.isEmpty ? ": " : "")\(originalParam.type)(fromJNI: \(translatedParam.0), in: environment!)"
137+
let label = originalParam.argumentLabel.map { "\($0): "} ?? ""
138+
return "\(label)\(originalParam.type)(fromJNI: \(translatedParam.0), in: environment!)"
139139
}
140140
let functionDowncall = "\(swiftModuleName).\(decl.name)(\(downcallParameters.joined(separator: ", ")))"
141141

@@ -247,7 +247,8 @@ extension SwiftStandardLibraryTypeKind {
247247
case .float: .float
248248
case .double: .double
249249
case .void: .void
250-
case .uint, .uint8, .uint32, .uint64, .unsafeRawPointer, .unsafeMutableRawPointer, .unsafePointer, .unsafeMutablePointer, .unsafeBufferPointer, .unsafeMutableBufferPointer, .string: nil
250+
case .string: .javaLangString
251+
case .uint, .uint8, .uint32, .uint64, .unsafeRawPointer, .unsafeMutableRawPointer, .unsafePointer, .unsafeMutablePointer, .unsafeBufferPointer, .unsafeMutableBufferPointer: nil
251252
}
252253
}
253254
}

Tests/JExtractSwiftTests/JNI/JNIModuleTests.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ struct JNIModuleTests {
2323
public func otherPrimitives(b: Bool, f: Float, d: Double)
2424
"""
2525

26+
let globalMethodWithString = """
27+
public func copy(_ string: String) -> String
28+
"""
29+
2630
@Test
2731
func generatesModuleJavaClass() throws {
2832
let input = "public func helloWorld()"
@@ -107,4 +111,43 @@ struct JNIModuleTests {
107111
]
108112
)
109113
}
114+
115+
@Test
116+
func globalMethodWithString_javaBindings() throws {
117+
try assertOutput(
118+
input: globalMethodWithString,
119+
.jni,
120+
.java,
121+
expectedChunks: [
122+
"""
123+
/**
124+
* Downcall to Swift:
125+
* {@snippet lang=swift :
126+
* public func copy(_ string: String) -> String
127+
* }
128+
*/
129+
public static native java.lang.String copy(java.lang.String string);
130+
""",
131+
]
132+
)
133+
}
134+
135+
@Test
136+
func globalMethodWithString_swiftThunks() throws {
137+
try assertOutput(
138+
input: globalMethodWithString,
139+
.jni,
140+
.swift,
141+
detectChunkByInitialLines: 1,
142+
expectedChunks: [
143+
"""
144+
@_cdecl("Java_com_example_swift_SwiftModule_copy")
145+
func swiftjava_SwiftModule_copy__(environment: UnsafeMutablePointer<JNIEnv?>!, thisClass: jclass, string: jstring?) -> jstring? {
146+
let result = SwiftModule.copy(String(fromJNI: string, in: environment!))
147+
return result.getJNIValue(in: environment)
148+
}
149+
""",
150+
]
151+
)
152+
}
110153
}

0 commit comments

Comments
 (0)