Dev: fix enum encoding
This commit is contained in:
parent
4fce9fa47b
commit
cf0a3934b9
|
@ -78,10 +78,12 @@ fileprivate extension NSLock {
|
||||||
|
|
||||||
fileprivate var javaClasses = [String: jclass]()
|
fileprivate var javaClasses = [String: jclass]()
|
||||||
fileprivate var javaMethods = [String: jmethodID]()
|
fileprivate var javaMethods = [String: jmethodID]()
|
||||||
|
fileprivate var javaStaticMethods = [String: jmethodID]()
|
||||||
fileprivate var javaFields = [String: jmethodID]()
|
fileprivate var javaFields = [String: jmethodID]()
|
||||||
|
|
||||||
fileprivate let javaClassesLock = NSLock()
|
fileprivate let javaClassesLock = NSLock()
|
||||||
fileprivate let javaMethodLock = NSLock()
|
fileprivate let javaMethodLock = NSLock()
|
||||||
|
fileprivate let javaStaticMethodLock = NSLock()
|
||||||
fileprivate let javaFieldLock = NSLock()
|
fileprivate let javaFieldLock = NSLock()
|
||||||
|
|
||||||
public extension JNICore {
|
public extension JNICore {
|
||||||
|
@ -160,6 +162,26 @@ public extension JNICore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func getStaticJavaMethod(forClass className: String, method: String, sig: String) throws -> jmethodID {
|
||||||
|
let key = "\(className).\(method)\(sig)"
|
||||||
|
let javaClass = try getJavaClass(className)
|
||||||
|
if let methodID = javaStaticMethods[key] {
|
||||||
|
return methodID
|
||||||
|
}
|
||||||
|
return try javaStaticMethodLock.sync {
|
||||||
|
if let methodID = javaStaticMethods[key] {
|
||||||
|
return methodID
|
||||||
|
}
|
||||||
|
guard let javaMethodID = JNI.api.GetStaticMethodID(JNI.env, javaClass, method, sig) else {
|
||||||
|
JNI.api.ExceptionClear(JNI.env)
|
||||||
|
JNI.ExceptionReset()
|
||||||
|
throw JNIError.methodNotFoundException(key)
|
||||||
|
}
|
||||||
|
javaStaticMethods[key] = javaMethodID
|
||||||
|
return javaMethodID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func getJavaField(forClass className: String, field: String, sig: String) throws -> jfieldID {
|
public func getJavaField(forClass className: String, field: String, sig: String) throws -> jfieldID {
|
||||||
let key = "\(className).\(field)\(sig)"
|
let key = "\(className).\(field)\(sig)"
|
||||||
let javaClass = try getJavaClass(className)
|
let javaClass = try getJavaClass(className)
|
||||||
|
|
|
@ -410,8 +410,11 @@ class JavaEnumValueEncodingContainer: SingleValueEncodingContainer {
|
||||||
let clazz = try JNI.getJavaClass(javaClass)
|
let clazz = try JNI.getJavaClass(javaClass)
|
||||||
// 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 = JNI.api.GetStaticMethodID(JNI.env, clazz, "valueOf", "(\(rawValue.type.sig))L\(javaClass);")
|
let valueOfMethodID = try JNI.getStaticJavaMethod(forClass: javaClass, method: "valueOf", sig: "(\(rawValue.type.sig))L\(javaClass);")
|
||||||
jniStorage.javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID!, args: [jvalue(l: rawValue.javaObject)])!
|
guard let javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID, args: [jvalue(l: rawValue.javaObject)]) else {
|
||||||
|
throw JavaCodingError.nilNotSupported("\(javaClass).valueOf()")
|
||||||
|
}
|
||||||
|
jniStorage.javaObject = javaObject
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let filed = try JNI.getJavaField(forClass: self.javaClass, field: "rawValue", sig: rawValue.type.sig)
|
let filed = try JNI.getJavaField(forClass: self.javaClass, field: "rawValue", sig: rawValue.type.sig)
|
||||||
|
@ -517,6 +520,8 @@ extension JavaEncoder {
|
||||||
let fullClassName = package + "/" + String(describing: type(of: value))
|
let fullClassName = package + "/" + String(describing: type(of: value))
|
||||||
// We don't create object for enum. Should be created at JavaEnumValueEncodingContainer
|
// We don't create object for enum. Should be created at JavaEnumValueEncodingContainer
|
||||||
storage = JNIStorageObject(type: .object(className: fullClassName))
|
storage = JNIStorageObject(type: .object(className: fullClassName))
|
||||||
|
javaObjects.append(storage)
|
||||||
|
try value.encode(to: self)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let storageType: JNIStorageType
|
let storageType: JNIStorageType
|
||||||
|
|
Loading…
Reference in New Issue