@@ -18,13 +18,7 @@ unsafe public class JavaException : Exception, IJavaPeerable
1818 JniObjectReference reference ;
1919#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
2020#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 ;
2822#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
2923
3024 protected static readonly JniObjectReference * InvalidJniObjectReference = null ;
@@ -106,7 +100,11 @@ public JniObjectReference PeerReference {
106100 return reference ;
107101#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
108102#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 ) ;
110108#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
111109 }
112110 }
@@ -137,8 +135,13 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
137135 this . reference = reference ;
138136#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
139137#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 ;
142145#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
143146
144147 JniObjectReference . Dispose ( ref reference , options ) ;
@@ -167,6 +170,9 @@ protected virtual void Dispose (bool disposing)
167170 if ( inner != null ) {
168171 inner . Dispose ( ) ;
169172 }
173+ #if FEATURE_JNIOBJECTREFERENCE_INTPTRS
174+ Java . Interop . JniObjectReferenceControlBlock . Free ( ref jniObjectReferenceControlBlock ) ;
175+ #endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
170176 }
171177
172178 public override bool Equals ( object ? obj )
@@ -282,6 +288,9 @@ void IJavaPeerable.SetPeerReference (JniObjectReference reference)
282288 {
283289 SetPeerReference ( ref reference , JniObjectReferenceOptions . Copy ) ;
284290 }
291+
292+ IntPtr IJavaPeerable . JniObjectReferenceControlBlock =>
293+ ( IntPtr ) jniObjectReferenceControlBlock ;
285294 }
286295}
287296
0 commit comments