@@ -18,13 +18,7 @@ unsafe public class JavaException : Exception, IJavaPeerable
18
18
JniObjectReference reference ;
19
19
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
20
20
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
21
- IntPtr handle ;
22
- JniObjectReferenceType handle_type ;
23
- #pragma warning disable 0169
24
- // Used by JavaInteropGCBridge
25
- IntPtr weak_handle ;
26
- int refs_added ;
27
- #pragma warning restore 0169
21
+ unsafe JniObjectReferenceControlBlock * jniObjectReferenceControlBlock ;
28
22
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
29
23
30
24
protected static readonly JniObjectReference * InvalidJniObjectReference = null ;
@@ -106,7 +100,11 @@ public JniObjectReference PeerReference {
106
100
return reference ;
107
101
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
108
102
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
109
- return new JniObjectReference ( handle , handle_type ) ;
103
+ var c = jniObjectReferenceControlBlock ;
104
+ if ( c == null ) {
105
+ return default ;
106
+ }
107
+ return new JniObjectReference ( c ->handle , ( JniObjectReferenceType ) c ->handle_type ) ;
110
108
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
111
109
}
112
110
}
@@ -137,8 +135,13 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
137
135
this . reference = reference ;
138
136
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
139
137
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
140
- this . handle = reference . Handle ;
141
- this . handle_type = reference . Type ;
138
+ var c = jniObjectReferenceControlBlock ;
139
+ if ( c == null ) {
140
+ c = jniObjectReferenceControlBlock =
141
+ Java . Interop . JniObjectReferenceControlBlock . Alloc ( ) ;
142
+ }
143
+ c ->handle = reference . Handle ;
144
+ c ->handle_type = ( int ) reference . Type ;
142
145
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
143
146
144
147
JniObjectReference . Dispose ( ref reference , options ) ;
@@ -167,6 +170,9 @@ protected virtual void Dispose (bool disposing)
167
170
if ( inner != null ) {
168
171
inner . Dispose ( ) ;
169
172
}
173
+ #if FEATURE_JNIOBJECTREFERENCE_INTPTRS
174
+ Java . Interop . JniObjectReferenceControlBlock . Free ( ref jniObjectReferenceControlBlock ) ;
175
+ #endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
170
176
}
171
177
172
178
public override bool Equals ( object ? obj )
@@ -282,6 +288,9 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference)
282
288
{
283
289
SetPeerReference ( ref reference , JniObjectReferenceOptions . Copy ) ;
284
290
}
291
+
292
+ IntPtr IJavaPeerable . JniObjectReferenceControlBlock =>
293
+ ( IntPtr ) jniObjectReferenceControlBlock ;
285
294
}
286
295
}
287
296
0 commit comments