Skip to content

Commit c407852

Browse files
committed
correct some type handling and add test for JNI unsigned
1 parent efd0907 commit c407852

File tree

7 files changed

+195
-22
lines changed

7 files changed

+195
-22
lines changed

Samples/JExtractJNISampleApp/Sources/MySwiftLibrary/MySwiftLibrary.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public func globalTakeIntInt(i: Int64, j: Int64) {
4545
p("i:\(i), j:\(j)")
4646
}
4747

48+
public func echoUnsignedInt(i: UInt32, j: UInt64) -> UInt64 {
49+
p("i:\(i), j:\(j)")
50+
return UInt64(i) + j
51+
}
52+
4853
// ==== Internal helpers
4954

5055
func p(_ msg: String, file: String = #fileID, line: UInt = #line, function: String = #function) {

Samples/JExtractJNISampleApp/src/test/java/com/example/swift/MySwiftLibraryTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,11 @@ void globalVariable() {
6161
MySwiftLibrary.setGlobalVariable(100);
6262
assertEquals(100, MySwiftLibrary.getGlobalVariable());
6363
}
64+
65+
@Test
66+
void globalUnsignedIntEcho() {
67+
int i = 12;
68+
long l = 1200;
69+
assertEquals(1212, MySwiftLibrary.echoUnsignedInt(12, 1200));
70+
}
6471
}

Sources/JExtractSwiftLib/JNI/JNIJavaTypeTranslator.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ enum JNIJavaTypeTranslator {
2929
case .bool: return .boolean
3030

3131
case .int8: return .byte
32-
case .uint8: return .char
32+
case .uint8: return .byte
33+
3334
case .int16: return .short
3435
case .uint16: return .char
3536

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ extension JNISwift2JavaGenerator {
6767
private func printModule(_ printer: inout CodePrinter) {
6868
printHeader(&printer)
6969
printPackage(&printer)
70+
printImports(&printer)
7071

7172
printModuleClass(&printer) { printer in
7273
printer.print(

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -249,27 +249,7 @@ extension JNISwift2JavaGenerator {
249249
return .placeholder // no conversions
250250

251251
case .wrapGuava:
252-
guard let typeName = javaType.fullyQualifiedClassName else {
253-
fatalError("Missing target class name for result conversion step from \(from) to \(javaType)")
254-
}
255-
256-
switch from {
257-
case .nominal(let nominal):
258-
switch nominal.nominalTypeDecl.knownTypeKind {
259-
case .uint8:
260-
return .call(.placeholder, function: "\(typeName).fromIntBits")
261-
case .uint16:
262-
return .placeholder // no conversion, UInt16 can be returned as-is and will be seen as char by Java
263-
case .uint32:
264-
return .call(.placeholder, function: "\(typeName).fromIntBits")
265-
case .uint64:
266-
return .call(.placeholder, function: "\(typeName).fromLongBits")
267-
default:
268-
fatalError("unsignedResultConversion: Unsupported conversion from \(from) to \(javaType)")
269-
}
270-
default:
271-
fatalError("unsignedResultConversion: Unsupported conversion from \(from) to \(javaType)")
272-
}
252+
fatalError("JExtract in JNI mode does not support the \(JExtractUnsignedIntegerMode.wrapGuava) unsigned numerics mode")
273253
}
274254
}
275255

Sources/JavaKit/BridgedValues/JavaValue+Integers.swift

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,66 @@
1414

1515
import JavaTypes
1616

17+
extension UInt8: JavaValue {
18+
public typealias JNIType = jbyte
19+
20+
public static var jvalueKeyPath: WritableKeyPath<jvalue, JNIType> { \.b }
21+
22+
public static var javaType: JavaType { .byte }
23+
24+
/// Retrieve the JNI value.
25+
public func getJNIValue(in environment: JNIEnvironment) -> JNIType { JNIType(self) }
26+
27+
/// Initialize from a JNI value.
28+
public init(fromJNI value: JNIType, in environment: JNIEnvironment) {
29+
self = Self(value)
30+
}
31+
32+
public static func jniMethodCall(
33+
in environment: JNIEnvironment
34+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
35+
environment.interface.CallByteMethodA
36+
}
37+
38+
public static func jniFieldGet(in environment: JNIEnvironment) -> JNIFieldGet<JNIType> {
39+
environment.interface.GetByteField
40+
}
41+
42+
public static func jniFieldSet(in environment: JNIEnvironment) -> JNIFieldSet<JNIType> {
43+
environment.interface.SetByteField
44+
}
45+
46+
public static func jniStaticMethodCall(
47+
in environment: JNIEnvironment
48+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
49+
environment.interface.CallStaticByteMethodA
50+
}
51+
52+
public static func jniStaticFieldGet(in environment: JNIEnvironment) -> JNIStaticFieldGet<JNIType> {
53+
environment.interface.GetStaticByteField
54+
}
55+
56+
public static func jniStaticFieldSet(in environment: JNIEnvironment) -> JNIStaticFieldSet<JNIType> {
57+
environment.interface.SetStaticByteField
58+
}
59+
60+
public static func jniNewArray(in environment: JNIEnvironment) -> JNINewArray {
61+
environment.interface.NewByteArray
62+
}
63+
64+
public static func jniGetArrayRegion(in environment: JNIEnvironment) -> JNIGetArrayRegion<JNIType> {
65+
environment.interface.GetByteArrayRegion
66+
}
67+
68+
public static func jniSetArrayRegion(in environment: JNIEnvironment) -> JNISetArrayRegion<JNIType> {
69+
environment.interface.SetByteArrayRegion
70+
}
71+
72+
public static var jniPlaceholderValue: jbyte {
73+
0
74+
}
75+
}
76+
1777
extension Int8: JavaValue {
1878
public typealias JNIType = jbyte
1979

@@ -170,6 +230,66 @@ extension Int16: JavaValue {
170230
}
171231
}
172232

233+
extension UInt32: JavaValue {
234+
public typealias JNIType = jint
235+
236+
public static var jvalueKeyPath: WritableKeyPath<jvalue, JNIType> { \.i }
237+
238+
public static var javaType: JavaType { .int }
239+
240+
/// Retrieve the JNI value.
241+
public func getJNIValue(in environment: JNIEnvironment) -> JNIType { JNIType(self) }
242+
243+
/// Initialize from a JNI value.
244+
public init(fromJNI value: JNIType, in environment: JNIEnvironment) {
245+
self = Self(value)
246+
}
247+
248+
public static func jniMethodCall(
249+
in environment: JNIEnvironment
250+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
251+
environment.interface.CallIntMethodA
252+
}
253+
254+
public static func jniFieldGet(in environment: JNIEnvironment) -> JNIFieldGet<JNIType> {
255+
environment.interface.GetIntField
256+
}
257+
258+
public static func jniFieldSet(in environment: JNIEnvironment) -> JNIFieldSet<JNIType> {
259+
environment.interface.SetIntField
260+
}
261+
262+
public static func jniStaticMethodCall(
263+
in environment: JNIEnvironment
264+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
265+
environment.interface.CallStaticIntMethodA
266+
}
267+
268+
public static func jniStaticFieldGet(in environment: JNIEnvironment) -> JNIStaticFieldGet<JNIType> {
269+
environment.interface.GetStaticIntField
270+
}
271+
272+
public static func jniStaticFieldSet(in environment: JNIEnvironment) -> JNIStaticFieldSet<JNIType> {
273+
environment.interface.SetStaticIntField
274+
}
275+
276+
public static func jniNewArray(in environment: JNIEnvironment) -> JNINewArray {
277+
environment.interface.NewIntArray
278+
}
279+
280+
public static func jniGetArrayRegion(in environment: JNIEnvironment) -> JNIGetArrayRegion<JNIType> {
281+
environment.interface.GetIntArrayRegion
282+
}
283+
284+
public static func jniSetArrayRegion(in environment: JNIEnvironment) -> JNISetArrayRegion<JNIType> {
285+
environment.interface.SetIntArrayRegion
286+
}
287+
288+
public static var jniPlaceholderValue: jint {
289+
0
290+
}
291+
}
292+
173293
extension Int32: JavaValue {
174294
public typealias JNIType = jint
175295

@@ -228,6 +348,64 @@ extension Int32: JavaValue {
228348
}
229349
}
230350

351+
extension UInt64: JavaValue {
352+
public typealias JNIType = jlong
353+
354+
public static var jvalueKeyPath: WritableKeyPath<jvalue, JNIType> { \.j }
355+
356+
public func getJNIValue(in environment: JNIEnvironment) -> JNIType { JNIType(self) }
357+
358+
public init(fromJNI value: JNIType, in environment: JNIEnvironment) {
359+
self = UInt64(value)
360+
}
361+
362+
public static var javaType: JavaType { .long }
363+
364+
public static func jniMethodCall(
365+
in environment: JNIEnvironment
366+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
367+
environment.interface.CallLongMethodA
368+
}
369+
370+
public static func jniFieldGet(in environment: JNIEnvironment) -> JNIFieldGet<JNIType> {
371+
environment.interface.GetLongField
372+
}
373+
374+
public static func jniFieldSet(in environment: JNIEnvironment) -> JNIFieldSet<JNIType> {
375+
environment.interface.SetLongField
376+
}
377+
378+
public static func jniStaticMethodCall(
379+
in environment: JNIEnvironment
380+
) -> ((JNIEnvironment, jobject, jmethodID, UnsafePointer<jvalue>?) -> JNIType) {
381+
environment.interface.CallStaticLongMethodA
382+
}
383+
384+
public static func jniStaticFieldGet(in environment: JNIEnvironment) -> JNIStaticFieldGet<JNIType> {
385+
environment.interface.GetStaticLongField
386+
}
387+
388+
public static func jniStaticFieldSet(in environment: JNIEnvironment) -> JNIStaticFieldSet<JNIType> {
389+
environment.interface.SetStaticLongField
390+
}
391+
392+
public static func jniNewArray(in environment: JNIEnvironment) -> JNINewArray {
393+
environment.interface.NewLongArray
394+
}
395+
396+
public static func jniGetArrayRegion(in environment: JNIEnvironment) -> JNIGetArrayRegion<JNIType> {
397+
environment.interface.GetLongArrayRegion
398+
}
399+
400+
public static func jniSetArrayRegion(in environment: JNIEnvironment) -> JNISetArrayRegion<JNIType> {
401+
environment.interface.SetLongArrayRegion
402+
}
403+
404+
public static var jniPlaceholderValue: jlong {
405+
0
406+
}
407+
}
408+
231409
extension Int64: JavaValue {
232410
public typealias JNIType = jlong
233411

Tests/JExtractSwiftTests/JNI/JNIVariablesTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct JNIVariablesTests {
2020
let membersSource =
2121
"""
2222
public class MyClass {
23+
public let someByte: UInt8
2324
public let constant: Int64
2425
public var mutable: Int64
2526
public var computed: Int64 {

0 commit comments

Comments
 (0)