Dev: add Date convertion
This commit is contained in:
parent
8880665e42
commit
f05846b4bb
|
@ -200,11 +200,13 @@ fileprivate class JavaObjectContainer<K : CodingKey> : KeyedDecodingContainerPro
|
||||||
public func decodeIfPresent<T>(_ type: T.Type, forKey key: K) throws -> T? where T : Decodable {
|
public func decodeIfPresent<T>(_ type: T.Type, forKey key: K) throws -> T? where T : Decodable {
|
||||||
return try decodeWithMissingStrategy(defaultValue: nil) {
|
return try decodeWithMissingStrategy(defaultValue: nil) {
|
||||||
if type == Date.self {
|
if type == Date.self {
|
||||||
// Java save TimeInterval in long (milliseconds)
|
let sig = "Ljava/util/Date;"
|
||||||
let sig = "J"
|
|
||||||
let fieldID = try getJavaField(forClass: javaClass, field: key.stringValue, sig: sig)
|
let fieldID = try getJavaField(forClass: javaClass, field: key.stringValue, sig: sig)
|
||||||
let timeInterval = JNI.api.GetLongField(JNI.env, javaObject, fieldID)
|
let dateObject = JNI.api.GetObjectField(JNI.env, javaObject, fieldID)
|
||||||
return Date(timeIntervalSince1970: TimeInterval(timeInterval) / 1000) as? T
|
let methodID = try getJavaMethod(forClass: "java/util/Date", method: "getTime", sig:"()J")
|
||||||
|
let timeInterval = JNI.api.CallLongMethodA(JNI.env, dateObject, methodID, nil)
|
||||||
|
// Java save TimeInterval in UInt64 milliseconds
|
||||||
|
return Date(timeIntervalSince1970: TimeInterval(timeInterval) / 1000.0) as? T
|
||||||
}
|
}
|
||||||
if type == URL.self {
|
if type == URL.self {
|
||||||
let sig = "Landroid/net/Uri;"
|
let sig = "Landroid/net/Uri;"
|
||||||
|
|
|
@ -439,6 +439,9 @@ class JavaEnumValueEncodingContainer: SingleValueEncodingContainer {
|
||||||
private var UriClass = JNI.GlobalFindClass("android/net/Uri")
|
private var UriClass = JNI.GlobalFindClass("android/net/Uri")
|
||||||
private var UriConstructor = JNI.api.GetStaticMethodID(JNI.env, JNI.GlobalFindClass("android/net/Uri"), "parse", "(Ljava/lang/String;)Landroid/net/Uri;")
|
private var UriConstructor = JNI.api.GetStaticMethodID(JNI.env, JNI.GlobalFindClass("android/net/Uri"), "parse", "(Ljava/lang/String;)Landroid/net/Uri;")
|
||||||
|
|
||||||
|
private var DateClass = JNI.GlobalFindClass("java/util/Date")
|
||||||
|
private var DateConstructor = JNI.api.GetMethodID(JNI.env, JNI.GlobalFindClass("java/util/Date"), "<init>", "(J)V")
|
||||||
|
|
||||||
extension JavaEncoder {
|
extension JavaEncoder {
|
||||||
|
|
||||||
fileprivate func getFullClassName<T>(_ value: T) -> String{
|
fileprivate func getFullClassName<T>(_ value: T) -> String{
|
||||||
|
@ -452,7 +455,23 @@ extension JavaEncoder {
|
||||||
fileprivate func box<T: Encodable>(_ value: T) throws -> JNIStorageObject {
|
fileprivate func box<T: Encodable>(_ value: T) throws -> JNIStorageObject {
|
||||||
let storage: JNIStorageObject
|
let storage: JNIStorageObject
|
||||||
|
|
||||||
if T.self == URL.self {
|
if T.self == Date.self {
|
||||||
|
let valueDate = value as! Date
|
||||||
|
|
||||||
|
var locals = [jobject]()
|
||||||
|
var args = [jvalue]()
|
||||||
|
args.append(jvalue(j: jlong(valueDate.timeIntervalSince1970 * 1000)))
|
||||||
|
|
||||||
|
let dateObject = JNIMethod.NewObject(className: "java/util/Date",
|
||||||
|
classCache: &DateClass,
|
||||||
|
methodSig: "(J)V",
|
||||||
|
methodCache: &DateConstructor,
|
||||||
|
args: &args,
|
||||||
|
locals: &locals)
|
||||||
|
|
||||||
|
storage = JNIStorageObject.init(type: .object(className: "java/util/Date"), javaObject: dateObject!)
|
||||||
|
}
|
||||||
|
else if T.self == URL.self {
|
||||||
var locals = [jobject]()
|
var locals = [jobject]()
|
||||||
let javaString = (value as! URL).absoluteString.localJavaObject(&locals)
|
let javaString = (value as! URL).absoluteString.localJavaObject(&locals)
|
||||||
var args = [jvalue]()
|
var args = [jvalue]()
|
||||||
|
|
Loading…
Reference in New Issue