1
- struct JavaMetaClass{T}
1
+ """
2
+ JavaRef is abstract parent for JavaLocalRef, JavaGlobalRef, and JavaNullRef in the JavaCall Module
3
+
4
+ It is distinct from its parent type, JavaCall.JNI.AbstractJavaRef, since its use is defined in
5
+ JavaCall itself rather than the JNI submodule.
6
+ """
7
+ abstract type JavaRef <: JNI.AbstractJavaRef end
8
+
9
+ """
10
+ JavaLocalRef is a JavaRef that is meant to be used with local variables in a function call.
11
+ After the function call these references may be freed and garbage collected. See note about
12
+ JNI memory management below.
13
+
14
+ This is the default reference type returned from the JNI.
15
+
16
+ Use this with JNI.PushLocalFrame / JNI.PopLocalFrame for memory management.
17
+ Also see JNI.EnsureLocalCapacity.
18
+
19
+ The internal pointer should be deleted using JNI.DeleteLocalRef
20
+ """
21
+ struct JavaLocalRef <: JavaRef
2
22
ptr:: Ptr{Nothing}
3
23
end
4
24
5
- # The metaclass, sort of equivalent to a the
6
- JavaMetaClass (T, ptr) = JavaMetaClass {T} (ptr)
25
+ """
26
+ JavaGlobalRef is a JavaRef that is meant to be used with global variables that live beyond
27
+ a single function call.
28
+ """
29
+ struct JavaGlobalRef <: JavaRef
30
+ ptr:: Ptr{Nothing}
31
+ end
32
+
33
+ """
34
+ JavaNullRef is a JavaRef that serves as a placeholder to mark where references have already been deleted.
7
35
8
- mutable struct JavaObject{T}
36
+ See J_NULL
37
+ """
38
+ struct JavaNullRef <: JavaRef
9
39
ptr:: Ptr{Nothing}
40
+ JavaNullRef () = new (C_NULL )
41
+ end
42
+
43
+ """ Constant JavaNullRef """
44
+ const J_NULL = JavaNullRef ()
45
+
46
+ Ptr (ref:: JavaRef ) = ref. ptr
47
+ Ptr {Nothing} (ref:: JavaRef ) = ref. ptr
48
+
49
+ JavaLocalRef (ref:: JavaRef ) = JavaLocalRef (JNI. NewLocalRef (Ptr (ref)))
50
+ JavaGlobalRef (ref:: JavaRef ) = JavaGlobalRef (JNI. NewGlobalRef (Ptr (ref)))
51
+
52
+ # _deleteref does local/global reference deletion without null or state checking
53
+ _deleteref (ref:: JavaLocalRef ) = JNI. DeleteLocalRef ( Ptr (ref))
54
+ _deleteref (ref:: JavaGlobalRef ) = JNI. DeleteGlobalRef (Ptr (ref))
55
+
56
+ """
57
+ deleteref deletes a JavaRef using either JNI.DeleteLocalRef or JNI.DeleteGlobalRef
58
+ """
59
+ function deleteref (x:: JavaRef )
60
+ if x. ptr == C_NULL ; return ; end
61
+ if ! JNI. is_env_loaded (); return ; end ;
62
+ _deleteref (x)
63
+ return
64
+ end
65
+
66
+ """
67
+ JavaMetaClass represents meta information about a Java class
68
+
69
+ These are usually cached in _jmc_cache and are meant to live
70
+ as long as the cache is valid.
71
+ """
72
+ struct JavaMetaClass{T} <: JNI.AbstractJavaRef
73
+ ref:: JavaRef
74
+ end
75
+
76
+ # The metaclass, sort of equivalent to a the
77
+ JavaMetaClass (T, ref:: JavaRef ) = JavaMetaClass {T} (ref)
78
+ JavaMetaClass (T, ptr:: Ptr{Nothing} ) = JavaMetaClass {T} (JavaGlobalRef (ptr))
79
+
80
+ ref (mc:: JavaMetaClass{T} ) where T = mc. ref
81
+ Ptr (mc:: JavaMetaClass{T} ) where T = Ptr (mc. ref)
82
+ Ptr {Nothing} (mc:: JavaMetaClass{T} ) where T = Ptr (mc. ref)
83
+
84
+ """
85
+ JavaObject{T} is the main JavaCall type representing either an instance
86
+ or a static class
87
+
88
+ T is usually a symbol referring a Java class name
89
+ """
90
+ mutable struct JavaObject{T} <: JNI.AbstractJavaRef
91
+ ref:: JavaRef
10
92
11
93
# This below is ugly. Once we stop supporting 0.5, this can be replaced by
12
94
# function JavaObject{T}(ptr) where T
13
- function JavaObject {T} (ptr ) where T
14
- j = new {T} (ptr )
95
+ function JavaObject {T} (ref ) where T
96
+ j = new {T} (ref )
15
97
finalizer (deleteref, j)
16
98
return j
17
99
end
@@ -20,17 +102,28 @@ mutable struct JavaObject{T}
20
102
JavaObject {T} (argtypes:: Tuple , args... ) where {T} = jnew (T, argtypes, args... )
21
103
end
22
104
105
+ # JavaObject Construction
23
106
JavaObject (T, ptr) = JavaObject {T} (ptr)
24
107
JavaObject {T} () where {T} = JavaObject {T} ((),)
108
+ JavaObject {T} (ptr:: Ptr{Nothing} ) where {T} = JavaObject {T} (JavaLocalRef (ptr))
25
109
26
- function deleteref (x:: JavaObject )
27
- if x. ptr == C_NULL ; return ; end
28
- if ! JNI. is_env_loaded (); return ; end ;
29
- JNI. DeleteLocalRef (x. ptr)
30
- x. ptr= C_NULL # Safety in case this function is called direcly, rather than at finalize
31
- return
32
- end
110
+ # JavaObject Reference Management
111
+ ref (x:: JavaObject{T} ) where T = x. ref
112
+ copyref (x:: JavaObject{T} ) where T = JavaObject {T} (JavaLocalRef (x. ref))
113
+ deleteref (x:: JavaObject{T} ) where T = ( deleteref (x. ref); x. ref = J_NULL )
114
+
115
+ # Obtain the underlying pointer for a JavaObject
116
+ Ptr (x:: JavaObject{T} ) where T = Ptr (x. ref)
117
+ Ptr {Nothing} (x:: JavaObject{T} ) where T = Ptr (x. ref)
33
118
119
+ """
120
+ jglobal(x::JavaObject) creates a new JavaGlobalRef and deletes the prior JavaRef
121
+ """
122
+ function jglobal (x:: JavaObject )
123
+ gref = JavaGlobalRef (JNI. NewGlobalRef (Ptr (x)))
124
+ deleteref (x. ref)
125
+ x. ref = gref
126
+ end
34
127
35
128
"""
36
129
```
@@ -44,7 +137,7 @@ Checks if the passed JavaObject is null or not
44
137
### Returns
45
138
true if the passed object is null else false
46
139
"""
47
- isnull (obj:: JavaObject ) = obj. ptr == C_NULL
140
+ isnull (obj:: JavaObject ) = Ptr ( obj) == C_NULL
48
141
isnull (obj:: Ptr{Nothing} ) = obj == C_NULL
49
142
50
143
"""
@@ -59,7 +152,7 @@ Checks if the passed JavaMetaClass is null or not
59
152
### Returns
60
153
true if the passed object is null else false
61
154
"""
62
- isnull (obj:: JavaMetaClass ) = obj. ptr == C_NULL
155
+ isnull (obj:: JavaMetaClass ) = Ptr ( obj) == C_NULL
63
156
64
157
const JClass = JavaObject{Symbol (" java.lang.Class" )}
65
158
const JObject = JavaObject{Symbol (" java.lang.Object" )}
@@ -82,7 +175,7 @@ jvalue(v::Integer)::JNI.jvalue = JNI.jvalue(v)
82
175
jvalue (v:: Float32 ) = jvalue (reinterpret (Int32, v))
83
176
jvalue (v:: Float64 ) = jvalue (reinterpret (Int64, v))
84
177
jvalue (v:: Ptr ) = jvalue (Int (v))
85
- jvalue (v:: JavaObject ) = jvalue (v . ptr )
178
+ jvalue (v:: JavaObject ) = jvalue (Ptr (v) )
86
179
87
180
88
181
function _jimport (juliaclass)
108
201
function jnew (T:: Symbol , argtypes:: Tuple , args... )
109
202
assertroottask_or_goodenv ()
110
203
sig = method_signature (Nothing, argtypes... )
111
- jmethodId = JNI. GetMethodID (metaclass (T). ptr , String (" <init>" ), sig)
204
+ jmethodId = JNI. GetMethodID (Ptr ( metaclass (T)) , String (" <init>" ), sig)
112
205
if jmethodId == C_NULL
113
206
throw (JavaCallError (" No constructor for $T with signature $sig " ))
114
207
end
@@ -120,7 +213,7 @@ function jcall(typ::Type{JavaObject{T}}, method::AbstractString, rettype::Type,
120
213
args... ) where T
121
214
assertroottask_or_goodenv ()
122
215
sig = method_signature (rettype, argtypes... )
123
- jmethodId = JNI. GetStaticMethodID (metaclass (T). ptr , String (method), sig)
216
+ jmethodId = JNI. GetStaticMethodID (Ptr ( metaclass (T)) , String (method), sig)
124
217
jmethodId== C_NULL && geterror (true )
125
218
_jcall (metaclass (T), jmethodId, C_NULL , rettype, argtypes, args... )
126
219
end
@@ -129,21 +222,21 @@ end
129
222
function jcall (obj:: JavaObject , method:: AbstractString , rettype:: Type , argtypes:: Tuple , args... )
130
223
assertroottask_or_goodenv ()
131
224
sig = method_signature (rettype, argtypes... )
132
- jmethodId = JNI. GetMethodID (metaclass (obj). ptr , String (method), sig)
225
+ jmethodId = JNI. GetMethodID (Ptr ( metaclass (obj)) , String (method), sig)
133
226
jmethodId== C_NULL && geterror (true )
134
227
_jcall (obj, jmethodId, C_NULL , rettype, argtypes, args... )
135
228
end
136
229
137
230
function jfield (typ:: Type{JavaObject{T}} , field:: AbstractString , fieldType:: Type ) where T
138
231
assertroottask_or_goodenv ()
139
- jfieldID = JNI. GetStaticFieldID (metaclass (T). ptr , String (field), signature (fieldType))
232
+ jfieldID = JNI. GetStaticFieldID (Ptr ( metaclass (T)) , String (field), signature (fieldType))
140
233
jfieldID== C_NULL && geterror (true )
141
234
_jfield (metaclass (T), jfieldID, fieldType)
142
235
end
143
236
144
237
function jfield (obj:: JavaObject , field:: AbstractString , fieldType:: Type )
145
238
assertroottask_or_goodenv ()
146
- jfieldID = JNI. GetFieldID (metaclass (obj). ptr , String (field), signature (fieldType))
239
+ jfieldID = JNI. GetFieldID (Ptr ( metaclass (obj)) , String (field), signature (fieldType))
147
240
jfieldID== C_NULL && geterror (true )
148
241
_jfield (obj, jfieldID, fieldType)
149
242
end
@@ -160,7 +253,7 @@ for (x, y, z) in [(:jboolean, :(JNI.GetBooleanField), :(JNI.GetStaticBooleanFiel
160
253
m = quote
161
254
function _jfield (obj, jfieldID:: Ptr{Nothing} , fieldType:: Type{$(x)} )
162
255
callmethod = ifelse ( typeof (obj)<: JavaObject , $ y , $ z )
163
- result = callmethod (obj. ptr , jfieldID)
256
+ result = callmethod (Ptr ( obj) , jfieldID)
164
257
result== C_NULL && geterror ()
165
258
return convert_result (fieldType, result)
166
259
end
170
263
171
264
function _jfield (obj, jfieldID:: Ptr{Nothing} , fieldType:: Type )
172
265
callmethod = ifelse ( typeof (obj)<: JavaObject , JNI. GetObjectField , JNI. GetStaticObjectField )
173
- result = callmethod (obj. ptr , jfieldID)
266
+ result = callmethod (Ptr ( obj) , jfieldID)
174
267
result== C_NULL && geterror ()
175
268
return convert_result (fieldType, result)
176
269
end
@@ -197,7 +290,7 @@ for (x, y, z) in [(:jboolean, :(JNI.CallBooleanMethodA), :(JNI.CallStaticBoolean
197
290
isnull (obj) && throw (JavaCallError (" Attempt to call method on Java NULL" ))
198
291
savedArgs, convertedArgs = convert_args (argtypes, args... )
199
292
GC. @preserve savedArgs begin
200
- result = callmethod (obj. ptr , jmethodId, Array {JNI.jvalue} (jvalue .(convertedArgs)))
293
+ result = callmethod (Ptr ( obj) , jmethodId, Array {JNI.jvalue} (jvalue .(convertedArgs)))
201
294
end
202
295
deleteref .(filter (x-> isa (x,JavaObject),convertedArgs))
203
296
result== C_NULL && geterror ()
@@ -224,7 +317,7 @@ function _jcall(obj, jmethodId::Ptr{Nothing}, callmethod::Union{Function,Ptr{Not
224
317
isnull (obj) && error (" Attempt to call method on Java NULL" )
225
318
savedArgs, convertedArgs = convert_args (argtypes, args... )
226
319
GC. @preserve savedArgs begin
227
- result = callmethod (obj. ptr , jmethodId, Array {JNI.jvalue} (jvalue .(convertedArgs)))
320
+ result = callmethod (Ptr ( obj) , jmethodId, Array {JNI.jvalue} (jvalue .(convertedArgs)))
228
321
end
229
322
deleteref .(filter (x-> isa (x,JavaObject),convertedArgs))
230
323
result== C_NULL && geterror ()
0 commit comments