Dev: add check for Fatal errors

This commit is contained in:
Andrew Druk 2019-04-09 14:36:21 +03:00
parent 0d2bd2b6a8
commit 86d270a328
3 changed files with 23 additions and 3 deletions

View File

@ -11,7 +11,7 @@ let package = Package(
) )
], ],
dependencies: [ dependencies: [
.package(url: "https://github.com/readdle/java_swift.git", .upToNextMinor(from: "2.1.4")), .package(url: "https://github.com/readdle/java_swift.git", .upToNextMinor(from: "2.1.5")),
.package(url: "https://github.com/readdle/swift-anycodable.git", .upToNextMinor(from: "1.0.2")), .package(url: "https://github.com/readdle/swift-anycodable.git", .upToNextMinor(from: "1.0.2")),
], ],
targets: [ targets: [

View File

@ -164,6 +164,10 @@ public struct JavaCoderConfig {
var locals = [jobject]() var locals = [jobject]()
let javaString = ($0 as! URL).absoluteString.localJavaObject(&locals) let javaString = ($0 as! URL).absoluteString.localJavaObject(&locals)
let args = [jvalue(l: javaString)] let args = [jvalue(l: javaString)]
JNI.SaveFatalErrorMessage("UriConstructor")
defer {
JNI.RemoveFatalErrorMessage()
}
return JNI.check(JNI.CallStaticObjectMethod(UriClass, methodID: UriConstructor!, args: args)!, &locals) return JNI.check(JNI.CallStaticObjectMethod(UriClass, methodID: UriConstructor!, args: args)!, &locals)
}, decodableClosure: { }, decodableClosure: {
let pathString = JNI.api.CallObjectMethodA(JNI.env, $0, ObjectToStringMethod, nil) let pathString = JNI.api.CallObjectMethodA(JNI.env, $0, ObjectToStringMethod, nil)
@ -172,10 +176,22 @@ public struct JavaCoderConfig {
RegisterType(type: Data.self, javaClassname: ByteBufferClassname, encodableClosure: { RegisterType(type: Data.self, javaClassname: ByteBufferClassname, encodableClosure: {
let valueData = $0 as! Data let valueData = $0 as! Data
let byteArray = JNI.api.NewByteArray(JNI.env, valueData.count)! let byteArray = JNI.api.NewByteArray(JNI.env, valueData.count)
if let throwable = JNI.ExceptionCheck() {
throw EncodingError.invalidValue($0, EncodingError.Context(codingPath: [],
debugDescription: "Can't create NewByteArray \(valueData.count)"))
}
valueData.withUnsafeBytes({ (pointer: UnsafePointer<Int8>) -> Void in valueData.withUnsafeBytes({ (pointer: UnsafePointer<Int8>) -> Void in
JNI.api.SetByteArrayRegion(JNI.env, byteArray, 0, valueData.count, pointer) JNI.api.SetByteArrayRegion(JNI.env, byteArray, 0, valueData.count, pointer)
}) })
if let throwable = JNI.ExceptionCheck() {
throw EncodingError.invalidValue($0, EncodingError.Context(codingPath: [],
debugDescription: "SetByteArrayRegion failed \(valueData.count)"))
}
JNI.SaveFatalErrorMessage("java/nio/ByteBuffer wrap")
defer {
JNI.RemoveFatalErrorMessage()
}
return JNI.CallStaticObjectMethod(ByteBufferClass, methodID: ByteBufferWrap, args: [jvalue(l: byteArray)])! return JNI.CallStaticObjectMethod(ByteBufferClass, methodID: ByteBufferWrap, args: [jvalue(l: byteArray)])!
}, decodableClosure: { }, decodableClosure: {
let byteArray = JNI.CallObjectMethod($0, methodID: ByteBufferArray) let byteArray = JNI.CallObjectMethod($0, methodID: ByteBufferArray)
@ -186,7 +202,7 @@ public struct JavaCoderConfig {
defer { defer {
JNI.api.ReleaseByteArrayElements(JNI.env, byteArray, pointer, 0) JNI.api.ReleaseByteArrayElements(JNI.env, byteArray, pointer, 0)
} }
return Data.init(bytes: pointer, count: length) return Data(bytes: pointer, count: length)
}) })
} }

View File

@ -419,6 +419,10 @@ class JavaEnumValueEncodingContainer: SingleValueEncodingContainer {
// If jniStorage.javaObject == nil its enum, else optionSet // If jniStorage.javaObject == nil its enum, else optionSet
if jniStorage.javaObject == nil { if jniStorage.javaObject == nil {
let valueOfMethodID = try JNI.getStaticJavaMethod(forClass: javaClass, method: "valueOf", sig: "(\(rawValue.type.sig))L\(javaClass);") let valueOfMethodID = try JNI.getStaticJavaMethod(forClass: javaClass, method: "valueOf", sig: "(\(rawValue.type.sig))L\(javaClass);")
JNI.SaveFatalErrorMessage("\(javaClass) valueOf \(rawValue.type.sig)")
defer {
JNI.RemoveFatalErrorMessage()
}
guard let javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID, args: [jvalue(l: rawValue.javaObject)]) else { guard let javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID, args: [jvalue(l: rawValue.javaObject)]) else {
throw JavaCodingError.nilNotSupported("\(javaClass).valueOf()") throw JavaCodingError.nilNotSupported("\(javaClass).valueOf()")
} }