22
33using System ;
44using System . Diagnostics . CodeAnalysis ;
5+ using System . Runtime . CompilerServices ;
6+ using System . Runtime . InteropServices ;
57using System . Runtime . Serialization ;
68
79namespace Java . Interop
810{
11+ internal struct JniObjectInfo {
12+ public IntPtr handle ;
13+ public JniObjectReferenceType handle_type ;
14+ // Used by JavaInteropGCBridge
15+ public IntPtr weak_handle ;
16+ public int refs_added ;
17+ }
18+
919 [ JniTypeSignature ( "java/lang/Object" , GenerateJavaPeer = false ) ]
1020 [ Serializable ]
1121 unsafe public class JavaObject : IJavaPeerable
@@ -25,13 +35,7 @@ unsafe public class JavaObject : IJavaPeerable
2535 [ NonSerialized ] JniObjectReference reference ;
2636#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
2737#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
28- [ NonSerialized ] IntPtr handle ;
29- [ NonSerialized ] JniObjectReferenceType handle_type ;
30- #pragma warning disable 0169
31- // Used by JavaInteropGCBridge
32- [ NonSerialized ] IntPtr weak_handle ;
33- [ NonSerialized ] int refs_added ;
34- #pragma warning restore 0169
38+ [ NonSerialized ] IntPtr JniObjectInfo = Marshal . AllocHGlobal ( Marshal . SizeOf < JniObjectInfo > ( ) ) ;
3539#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
3640
3741 protected static readonly JniObjectReference * InvalidJniObjectReference = null ;
@@ -47,7 +51,8 @@ public JniObjectReference PeerReference {
4751 return reference ;
4852#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
4953#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
50- return new JniObjectReference ( handle , handle_type ) ;
54+ var info = Unsafe . Read < JniObjectInfo > ( ( void * ) JniObjectInfo ) ;
55+ return new JniObjectReference ( info . handle , info . handle_type ) ;
5156#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
5257 }
5358 }
@@ -61,6 +66,7 @@ public virtual JniPeerMembers JniPeerMembers {
6166
6267 public JavaObject ( ref JniObjectReference reference , JniObjectReferenceOptions options )
6368 {
69+ Unsafe . Write < JniObjectInfo > ( ( void * ) JniObjectInfo , new JniObjectInfo ( ) ) ;
6470 Construct ( ref reference , options ) ;
6571 }
6672
@@ -91,8 +97,10 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
9197 this . reference = reference ;
9298#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
9399#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
94- this . handle = reference . Handle ;
95- this . handle_type = reference . Type ;
100+ var info = Unsafe . Read < JniObjectInfo > ( ( void * ) JniObjectInfo ) ;
101+ info . handle = reference . Handle ;
102+ info . handle_type = reference . Type ;
103+ Unsafe . Write < JniObjectInfo > ( ( void * ) JniObjectInfo , info ) ;
96104#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
97105
98106 JniObjectReference . Dispose ( ref reference , options ) ;
@@ -107,6 +115,11 @@ public void UnregisterFromRuntime ()
107115
108116 public void Dispose ( )
109117 {
118+ if ( JniObjectInfo != IntPtr . Zero )
119+ {
120+ Marshal . FreeHGlobal ( JniObjectInfo ) ;
121+ JniObjectInfo = IntPtr . Zero ;
122+ }
110123 JniEnvironment . Runtime . ValueManager . DisposePeer ( this ) ;
111124 }
112125
0 commit comments