diff --git a/Sources/JNICore+JavaCoder.swift b/Sources/JNICore+JavaCoder.swift index 378cd2e..d251889 100644 --- a/Sources/JNICore+JavaCoder.swift +++ b/Sources/JNICore+JavaCoder.swift @@ -107,15 +107,15 @@ fileprivate let javaFieldLock = NSLock() public extension JNICore { - public var TRUE: jboolean { + var TRUE: jboolean { return jboolean(JNI_TRUE) } - public var FALSE: jboolean { + var FALSE: jboolean { return jboolean(JNI_FALSE) } - public enum JNIError: Error { + enum JNIError: Error { case classNotFoundException(String) case methodNotFoundException(String) @@ -135,7 +135,7 @@ public extension JNICore { } // MARK: Global cache functions - public func getJavaClass(_ className: String) throws -> jclass { + func getJavaClass(_ className: String) throws -> jclass { return try javaClassesLock.sync { if let javaClass = javaClasses[className] { return javaClass @@ -150,11 +150,11 @@ public extension JNICore { } } - public func getJavaEmptyConstructor(forClass className: String) throws -> jmethodID { + func getJavaEmptyConstructor(forClass className: String) throws -> jmethodID { return try getJavaMethod(forClass: className, method: "", sig: "()V") } - public func getJavaMethod(forClass className: String, method: String, sig: String) throws -> jmethodID { + func getJavaMethod(forClass className: String, method: String, sig: String) throws -> jmethodID { let key = "\(className).\(method)\(sig)" let javaClass = try getJavaClass(className) return try javaMethodLock.sync { @@ -171,7 +171,7 @@ public extension JNICore { } } - public func getStaticJavaMethod(forClass className: String, method: String, sig: String) throws -> jmethodID { + func getStaticJavaMethod(forClass className: String, method: String, sig: String) throws -> jmethodID { let key = "\(className).\(method)\(sig)" let javaClass = try getJavaClass(className) return try javaStaticMethodLock.sync { @@ -188,7 +188,7 @@ public extension JNICore { } } - public func getJavaField(forClass className: String, field: String, sig: String) throws -> jfieldID { + func getJavaField(forClass className: String, field: String, sig: String) throws -> jfieldID { let key = "\(className).\(field)\(sig)" let javaClass = try getJavaClass(className) return try javaFieldLock.sync({ @@ -206,7 +206,7 @@ public extension JNICore { }) } - public func GlobalFindClass( _ name: UnsafePointer, + func GlobalFindClass( _ name: UnsafePointer, _ file: StaticString = #file, _ line: Int = #line ) -> jclass? { guard let clazz: jclass = FindClass(name, file, line ) else { return nil @@ -217,87 +217,87 @@ public extension JNICore { } // MARK: Constructors - public func NewObject(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jobject? { + func NewObject(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jobject? { return checkArgument(args: args, { argsPtr in api.NewObjectA(env, clazz, methodID, argsPtr) }) } // MARK: Object methods - public func CallBooleanMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jboolean { + func CallBooleanMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jboolean { return checkArgument(args: args, { argsPtr in api.CallBooleanMethodA(env, object, methodID, argsPtr) }) } - public func CallByteMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jbyte { + func CallByteMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jbyte { return checkArgument(args: args, { argsPtr in api.CallByteMethodA(env, object, methodID, argsPtr) }) } - public func CallShortMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jshort { + func CallShortMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jshort { return checkArgument(args: args, { argsPtr in api.CallShortMethodA(env, object, methodID, argsPtr) }) } - public func CallIntMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jint { + func CallIntMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jint { return checkArgument(args: args, { argsPtr in api.CallIntMethodA(env, object, methodID, argsPtr) }) } - public func CallLongMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jlong { + func CallLongMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jlong { return checkArgument(args: args, { argsPtr in api.CallLongMethodA(env, object, methodID, argsPtr) }) } - public func CallObjectMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jobject? { + func CallObjectMethod(_ object: jobject, methodID: jmethodID, args: [jvalue] = []) -> jobject? { return checkArgument(args: args, { argsPtr in api.CallObjectMethodA(env, object, methodID, argsPtr) }) } // MARK: Static methods - public func CallStaticBooleanMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jboolean { + func CallStaticBooleanMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jboolean { return checkArgument(args: args, { argsPtr in api.CallStaticBooleanMethodA(env, clazz, methodID, argsPtr) }) } - public func CallStaticByteMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jbyte { + func CallStaticByteMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jbyte { return checkArgument(args: args, { argsPtr in api.CallStaticByteMethodA(env, clazz, methodID, argsPtr) }) } - public func CallStaticShortMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jshort { + func CallStaticShortMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jshort { return checkArgument(args: args, { argsPtr in api.CallStaticShortMethodA(env, clazz, methodID, argsPtr) }) } - public func CallStaticIntMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jint { + func CallStaticIntMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jint { return checkArgument(args: args, { argsPtr in api.CallStaticIntMethodA(env, clazz, methodID, argsPtr) }) } - public func CallStaticLongMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jlong { + func CallStaticLongMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jlong { return checkArgument(args: args, { argsPtr in api.CallStaticLongMethodA(env, clazz, methodID, argsPtr) }) } - public func CallStaticObjectMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jobject? { + func CallStaticObjectMethod(_ clazz: jclass, methodID: jmethodID, args: [jvalue] = []) -> jobject? { return checkArgument(args: args, { argsPtr in api.CallStaticObjectMethodA(env, clazz, methodID, argsPtr) }) } - public func dumpReferenceTables() { + func dumpReferenceTables() { JNI.api.CallStaticVoidMethodA(JNI.env, VMDebugClass, VMDebugDumpReferenceTablesMethod, nil) JNI.api.ExceptionClear(JNI.env) JNI.ExceptionReset() @@ -323,25 +323,25 @@ public extension JNICore { } // MARK: New API - public func CallObjectMethod(_ object: jobject, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) -> jobject? { + func CallObjectMethod(_ object: jobject, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) -> jobject? { return checkArgumentAndWrap(args: args, { argsPtr in api.CallObjectMethodA(env, object, methodID, argsPtr) }) } - public func CallStaticObjectMethod(_ clazz: jclass, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) -> jobject? { + func CallStaticObjectMethod(_ clazz: jclass, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) -> jobject? { return checkArgumentAndWrap(args: args, { argsPtr in api.CallStaticObjectMethodA(env, clazz, methodID, argsPtr) }) } - public func CallVoidMethod(_ object: jobject, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) { + func CallVoidMethod(_ object: jobject, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) { checkArgumentAndWrap(args: args, { argsPtr in api.CallVoidMethodA(env, object, methodID, argsPtr) }) } - public func CallStaticVoidMethod(_ clazz: jclass, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) { + func CallStaticVoidMethod(_ clazz: jclass, _ methodID: jmethodID, _ args: JNIArgumentProtocol...) { checkArgumentAndWrap(args: args, { argsPtr in api.CallStaticVoidMethodA(env, clazz, methodID, argsPtr) }) diff --git a/Sources/JNIObject+JavaCoder.swift b/Sources/JNIObject+JavaCoder.swift index 85afa9e..73f173e 100644 --- a/Sources/JNIObject+JavaCoder.swift +++ b/Sources/JNIObject+JavaCoder.swift @@ -26,31 +26,31 @@ public class JNIObjectWithClass: JNIObject { public extension JNIObject { - public static func getJavaClassname(javaObject: jobject?) -> String { + static func getJavaClassname(javaObject: jobject?) -> String { let cls = JNI.api.GetObjectClass(JNI.env, javaObject) let javaClassName = JNI.api.CallObjectMethodA(JNI.env, cls, ClassGetNameMethod, nil) return String(javaObject: javaClassName).replacingOccurrences(of: ".", with: "/") } - public var className: String { + var className: String { if let jniObject = self as? JNIObjectWithClass { return jniObject.privateClassName } return JNIObject.getJavaClassname(javaObject: self.javaObject) } - public func callVoidMethod(_ methodID: jmethodID, _ args: JNIArgumentProtocol...) { + func callVoidMethod(_ methodID: jmethodID, _ args: JNIArgumentProtocol...) { checkArgumentAndWrap(args: args, { argsPtr in JNI.api.CallVoidMethodA(JNI.env, javaObject, methodID, argsPtr) }) } - public func callStringMethod(method: String? = nil, functionName: String = #function, _ args: JNIArgumentProtocol...) -> String { + func callStringMethod(method: String? = nil, functionName: String = #function, _ args: JNIArgumentProtocol...) -> String { let methodName = method ?? String(functionName.split(separator: "(")[0]) return String(javaObject: self.internalcallObjectMethod(method: methodName, returnType: "Ljava/lang/String;", args)) } - public func callObjectMethod(method: String? = nil, functionName: String = #function, returnType: String, _ args: JNIArgumentProtocol...) -> jobject? { + func callObjectMethod(method: String? = nil, functionName: String = #function, returnType: String, _ args: JNIArgumentProtocol...) -> jobject? { let methodName = method ?? String(functionName.split(separator: "(")[0]) return self.internalcallObjectMethod(method: methodName, returnType: returnType, args) } diff --git a/Sources/JavaCoderConfig.swift b/Sources/JavaCoderConfig.swift index 5102369..ec5187e 100644 --- a/Sources/JavaCoderConfig.swift +++ b/Sources/JavaCoderConfig.swift @@ -181,8 +181,12 @@ public struct JavaCoderConfig { throw EncodingError.invalidValue($0, EncodingError.Context(codingPath: [], debugDescription: "Can't create NewByteArray \(valueData.count)")) } - valueData.withUnsafeBytes({ (pointer: UnsafePointer) -> Void in - JNI.api.SetByteArrayRegion(JNI.env, byteArray, 0, jint(valueData.count), pointer) + try valueData.withUnsafeBytes({ pointer in + guard let bytes = pointer.baseAddress?.assumingMemoryBound(to: Int8.self) else { + throw EncodingError.invalidValue(valueData, EncodingError.Context(codingPath: [], + debugDescription: "Can't get unsafeBytes \(valueData.count)")) + } + JNI.api.SetByteArrayRegion(JNI.env, byteArray, 0, jint(valueData.count), bytes) }) if let throwable = JNI.ExceptionCheck() { throw EncodingError.invalidValue($0, EncodingError.Context(codingPath: [],