1
1
import CJNI
2
+ import Dispatch
2
3
3
4
/// Designed to simplify calling a constructor and methods on a JavaClass
4
5
/// Subclass this and add the methods appropriate to the object you are constructing.
5
6
open class JNIObject {
6
- public let javaClass : JavaClass
7
+ open class var className : String {
8
+ return " java.lang.object "
9
+ }
10
+
11
+ private static var classInstances = [ String: JavaClass] ( )
12
+
13
+ public static var javaClass : JavaClass {
14
+ return DispatchQueue . main. sync {
15
+ if let classInstance = classInstances [ className] {
16
+ return classInstance
17
+ }
18
+
19
+ let javaClassLocalRef = try ! jni. FindClass ( name: className. replacingFullstopsWithSlashes ( ) )
20
+ try ! checkAndThrowOnJNIError ( )
21
+ let classInstance = jni. NewGlobalRef ( javaClassLocalRef) !
22
+ classInstances [ className] = classInstance
23
+
24
+ return classInstance
25
+ }
26
+ }
27
+
7
28
public let instance : JavaObject
8
29
9
30
required public init ( _ instance: JavaObject ) throws {
10
31
guard let globalInstanceRef = jni. NewGlobalRef ( instance) else {
11
32
throw Error . couldntCreateGlobalRef
12
33
}
13
34
14
- let javaClassLocalRef = try jni. GetObjectClass ( obj: instance)
15
- let javaClass = jni. NewGlobalRef ( javaClassLocalRef)
16
35
try checkAndThrowOnJNIError ( )
17
- self . javaClass = javaClass!
18
36
self . instance = globalInstanceRef
19
37
}
20
38
39
+ @available ( * , deprecated, message: " Override Self.className instead and use the initializers that don't take className as an argument " )
21
40
convenience public init ( _ className: String , arguments: [ JavaParameterConvertible ] = [ ] ) throws {
22
41
let className = className. replacingFullstopsWithSlashes ( )
23
42
let javaClassLocalRef = try jni. FindClass ( name: className)
@@ -29,22 +48,39 @@ open class JNIObject {
29
48
try self . init ( instanceLocalRef)
30
49
}
31
50
51
+ convenience public init ( arguments: JavaParameterConvertible ... ) throws {
52
+ guard let instanceLocalRef = try jni. callConstructor ( on: type ( of: self ) . javaClass, arguments: arguments) else {
53
+ throw Error . couldntCallConstructor
54
+ }
55
+
56
+ try self . init ( instanceLocalRef)
57
+ }
58
+
32
59
deinit {
33
60
jni. DeleteGlobalRef ( instance)
34
- jni. DeleteGlobalRef ( javaClass)
35
61
}
36
62
37
63
public func call( methodName: String , arguments: [ JavaParameterConvertible ] = [ ] ) throws {
38
64
try jni. call ( methodName, on: self . instance, arguments: arguments)
39
65
}
40
66
41
- public func call< T: JavaInitializableFromMethod & JavaParameterConvertible > ( methodName: String , arguments: [ JavaParameterConvertible ] = [ ] ) throws -> T {
67
+ public func call< T: JavaInitializableFromMethod & JavaParameterConvertible > (
68
+ methodName: String ,
69
+ arguments: [ JavaParameterConvertible ] = [ ]
70
+ ) throws -> T {
42
71
return try jni. call ( methodName, on: self . instance, arguments: arguments)
43
72
}
44
73
45
- public func callStatic( methodName: String , arguments: [ JavaParameterConvertible ] = [ ] ) throws {
74
+ public static func callStatic( methodName: String , arguments: [ JavaParameterConvertible ] = [ ] ) throws {
46
75
try jni. callStatic ( methodName, on: self . javaClass, arguments: arguments)
47
76
}
77
+
78
+ public static func callStatic< T: JavaInitializableFromMethod & JavaParameterConvertible > (
79
+ methodName: String ,
80
+ arguments: [ JavaParameterConvertible ] = [ ]
81
+ ) throws -> T {
82
+ return try jni. callStatic ( methodName, on: self . javaClass, arguments: arguments)
83
+ }
48
84
}
49
85
50
86
extension JNIObject {
@@ -55,7 +91,10 @@ extension JNIObject {
55
91
}
56
92
57
93
extension JNI {
58
- func callConstructor( on targetClass: JavaClass , arguments: [ JavaParameterConvertible ] = [ ] ) throws -> JavaObject ? {
94
+ func callConstructor(
95
+ on targetClass: JavaClass ,
96
+ arguments: [ JavaParameterConvertible ] = [ ]
97
+ ) throws -> JavaObject ? {
59
98
let methodID = _env. pointee. pointee. GetMethodID ( _env, targetClass, " <init> " , arguments. methodSignature ( returnType: nil ) )
60
99
try checkAndThrowOnJNIError ( )
61
100
@@ -64,19 +103,19 @@ extension JNI {
64
103
}
65
104
66
105
public extension JNI {
67
- public func NewObject( targetClass: JavaClass , _ methodID: JavaMethodID , _ args: [ JavaParameter ] ) throws -> JavaObject ? {
68
- let env = self . _env
106
+ func NewObject( targetClass: JavaClass , _ methodID: JavaMethodID , _ args: [ JavaParameter ] ) throws -> JavaObject ? {
107
+ let env = self . _env
69
108
var mutableArgs = args
70
109
let newObject = env. pointee. pointee. NewObject ( env, targetClass, methodID, & mutableArgs)
71
110
try checkAndThrowOnJNIError ( )
72
111
73
112
return newObject
74
- }
113
+ }
75
114
76
- public func GetObjectClass( obj: JavaObject ) throws -> JavaClass {
77
- let env = self . _env
115
+ func GetObjectClass( obj: JavaObject ) throws -> JavaClass {
116
+ let env = self . _env
78
117
let result = env. pointee. pointee. GetObjectClass ( env, obj)
79
118
try checkAndThrowOnJNIError ( )
80
119
return result!
81
- }
120
+ }
82
121
}
0 commit comments