From 9812157f92d8160fe30c99aa63ef42996f646af3 Mon Sep 17 00:00:00 2001 From: rikner Date: Wed, 14 Oct 2020 12:25:35 +0200 Subject: [PATCH 1/3] implement JNIObject.getField --- Sources/JNI/JNIObjects.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/JNI/JNIObjects.swift b/Sources/JNI/JNIObjects.swift index 92ec789..22ec911 100644 --- a/Sources/JNI/JNIObjects.swift +++ b/Sources/JNI/JNIObjects.swift @@ -71,6 +71,12 @@ open class JNIObject { return try jni.call(methodName, on: self.instance, arguments: arguments) } + public func getField( + _ fieldName: String + ) throws -> T { + return try jni.GetField(fieldName, from: self.instance) + } + public static func callStatic(methodName: String, arguments: [JavaParameterConvertible] = []) throws { try jni.callStatic(methodName, on: self.javaClass, arguments: arguments) } From b046dd95de14004669907d652490f31ba37ee133 Mon Sep 17 00:00:00 2001 From: rikner Date: Wed, 14 Oct 2020 17:53:52 +0200 Subject: [PATCH 2/3] fix bugs --- Sources/JNI/JNIFields.swift | 3 +++ Sources/JNI/JNIObjects.swift | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Sources/JNI/JNIFields.swift b/Sources/JNI/JNIFields.swift index 59570d6..c470bec 100644 --- a/Sources/JNI/JNIFields.swift +++ b/Sources/JNI/JNIFields.swift @@ -18,6 +18,9 @@ public extension JNI { func GetField(_ fieldName: String, from javaObject: JavaObject) throws -> T { let env = self._env let javaClass = try GetObjectClass(obj: javaObject) + defer { + jni.DeleteLocalRef(javaClass) + } let fieldID = env.pointee.pointee.GetFieldID(env, javaClass, fieldName, T.asJNIParameterString) try checkAndThrowOnJNIError() return try T.fromField(fieldID!, on: javaObject) diff --git a/Sources/JNI/JNIObjects.swift b/Sources/JNI/JNIObjects.swift index 22ec911..476c9c8 100644 --- a/Sources/JNI/JNIObjects.swift +++ b/Sources/JNI/JNIObjects.swift @@ -1,5 +1,6 @@ import CJNI import Dispatch +import Foundation /// Designed to simplify calling a constructor and methods on a JavaClass /// Subclass this and add the methods appropriate to the object you are constructing. @@ -11,7 +12,7 @@ open class JNIObject { private static var classInstances = [String: JavaClass]() public static var javaClass: JavaClass { - return DispatchQueue.main.sync { + func getClassInstance() -> JavaClass { if let classInstance = classInstances[className] { return classInstance } @@ -23,6 +24,15 @@ open class JNIObject { return classInstance } + + if Thread.isMainThread { + return getClassInstance() + } else { + return DispatchQueue.main.sync { + return getClassInstance() + } + } + } public let instance: JavaObject From b5bcbb90bf562c2d80bd6111ba2fd97618b1cda9 Mon Sep 17 00:00:00 2001 From: rikner Date: Thu, 15 Oct 2020 12:16:27 +0200 Subject: [PATCH 3/3] make methodSignature() and asJavaParameters() public --- Sources/JNI/Array+JavaParameterConvertible.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/JNI/Array+JavaParameterConvertible.swift b/Sources/JNI/Array+JavaParameterConvertible.swift index be25390..7d06482 100644 --- a/Sources/JNI/Array+JavaParameterConvertible.swift +++ b/Sources/JNI/Array+JavaParameterConvertible.swift @@ -15,7 +15,7 @@ extension String { } extension Array where Element == JavaParameterConvertible { - func asJavaParameters() -> [JavaParameter] { + public func asJavaParameters() -> [JavaParameter] { return self.map { $0.toJavaParameter() } } @@ -27,12 +27,12 @@ extension Array where Element == JavaParameterConvertible { /// Returns the String of ordered arguments enclosed in brackets, followed by the `returnType`'s type string, or 'V' /// (Void) if nil is provided. e.g. Returns "(II)V" for `[JavaInt(1), JavaInt(99)].methodSignature(returnType: nil)` - func methodSignature(returnType: JavaParameterConvertible.Type?) -> String { + public func methodSignature(returnType: JavaParameterConvertible.Type?) -> String { let returnTypeString = returnType?.asJNIParameterString ?? "V" return "(" + self.argumentSignature() + ")" + returnTypeString } - func methodSignature(customReturnType: String) -> String { + public func methodSignature(customReturnType: String) -> String { let returnTypeString = customReturnType.replacingFullstopsWithSlashes() return "(" + self.argumentSignature() + ")" + returnTypeString }