diff --git a/Sources/JNICore+JavaCoder.swift b/Sources/JNICore+JavaCoder.swift index d251889..c744234 100644 --- a/Sources/JNICore+JavaCoder.swift +++ b/Sources/JNICore+JavaCoder.swift @@ -22,6 +22,7 @@ var ArrayListClassname = "java/util/ArrayList" let HashMapClassname = "java/util/HashMap" let SetClassname = "java/util/Set" let UriClassname = "android/net/Uri" +let UuidClassname = "java/util/UUID" let DateClassname = "java/util/Date" let HashSetClassname = "java/util/HashSet" let ByteBufferClassname = "java/nio/ByteBuffer" @@ -38,6 +39,7 @@ var BooleanClass = try! JNI.getJavaClass("java/lang/Boolean") var StringClass = try! JNI.getJavaClass("java/lang/String") let ExceptionClass = try! JNI.getJavaClass("java/lang/Exception") let UriClass = try! JNI.getJavaClass("android/net/Uri") +let UuidClass = try! JNI.getJavaClass("java/util/UUID") let DateClass = try! JNI.getJavaClass("java/util/Date") let VMDebugClass = try! JNI.getJavaClass("dalvik/system/VMDebug") let HashSetClass = try! JNI.getJavaClass("java/util/HashSet") @@ -47,6 +49,7 @@ let DoubleClass = try! JNI.getJavaClass("java/lang/Double") // MARK: Java methods let UriConstructor = JNI.api.GetStaticMethodID(JNI.env, UriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;") +let UuidConstructor = JNI.api.GetStaticMethodID(JNI.env, UuidClass, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;") let DateConstructor = try! JNI.getJavaMethod(forClass: "java/util/Date", method: "", sig: "(J)V") let IntegerConstructor = try! JNI.getJavaMethod(forClass: IntegerClassname, method: "", sig: "(I)V") let ByteConstructor = try! JNI.getJavaMethod(forClass: ByteClassname, method: "", sig: "(B)V") diff --git a/Sources/JavaCoderConfig.swift b/Sources/JavaCoderConfig.swift index ec5187e..31a4699 100644 --- a/Sources/JavaCoderConfig.swift +++ b/Sources/JavaCoderConfig.swift @@ -174,6 +174,20 @@ public struct JavaCoderConfig { return URL(string: String(javaObject: pathString)) }) + JavaCoderConfig.RegisterType(type: UUID.self, javaClassname: UuidClassname, encodableClosure: { + var locals = [jobject]() + let javaString = ($0 as! UUID).uuidString.localJavaObject(&locals) + let args = [jvalue(l: javaString)] + JNI.SaveFatalErrorMessage("UuidConstructor") + defer { + JNI.RemoveFatalErrorMessage() + } + return JNI.check(JNI.CallStaticObjectMethod(UuidClass, methodID: UuidConstructor!, args: args)!, &locals) + }, decodableClosure: { + let pathString = JNI.api.CallObjectMethodA(JNI.env, $0, ObjectToStringMethod, nil) + return UUID(uuidString: String(javaObject: pathString)) + }) + RegisterType(type: Data.self, javaClassname: ByteBufferClassname, encodableClosure: { let valueData = $0 as! Data let byteArray = JNI.api.NewByteArray(JNI.env, jint(valueData.count)) @@ -213,4 +227,4 @@ public struct JavaCoderConfig { }) } -} \ No newline at end of file +} diff --git a/doc/JNITypes.md b/doc/JNITypes.md index cc2f583..7ee66e0 100644 --- a/doc/JNITypes.md +++ b/doc/JNITypes.md @@ -20,4 +20,5 @@ OptionSet // custom type with rawValue field and valueOf() static method URL // android/net/Uri - Date // java/util/Date \ No newline at end of file + UUID // java/util/UUID + Date // java/util/Date