2
2
3
3
using System ;
4
4
using System . Diagnostics . CodeAnalysis ;
5
+ using System . Runtime . CompilerServices ;
6
+ using System . Runtime . InteropServices ;
5
7
using System . Runtime . Serialization ;
6
8
7
9
namespace Java . Interop
8
10
{
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
+
9
19
[ JniTypeSignature ( "java/lang/Object" , GenerateJavaPeer = false ) ]
10
20
[ Serializable ]
11
21
unsafe public class JavaObject : IJavaPeerable
@@ -25,13 +35,7 @@ unsafe public class JavaObject : IJavaPeerable
25
35
[ NonSerialized ] JniObjectReference reference ;
26
36
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
27
37
#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 > ( ) ) ;
35
39
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
36
40
37
41
protected static readonly JniObjectReference * InvalidJniObjectReference = null ;
@@ -47,7 +51,8 @@ public JniObjectReference PeerReference {
47
51
return reference ;
48
52
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
49
53
#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 ) ;
51
56
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
52
57
}
53
58
}
@@ -61,6 +66,7 @@ public virtual JniPeerMembers JniPeerMembers {
61
66
62
67
public JavaObject ( ref JniObjectReference reference , JniObjectReferenceOptions options )
63
68
{
69
+ Unsafe . Write < JniObjectInfo > ( ( void * ) JniObjectInfo , new JniObjectInfo ( ) ) ;
64
70
Construct ( ref reference , options ) ;
65
71
}
66
72
@@ -91,8 +97,10 @@ protected void SetPeerReference (ref JniObjectReference reference, JniObjectRefe
91
97
this . reference = reference ;
92
98
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
93
99
#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 ) ;
96
104
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
97
105
98
106
JniObjectReference . Dispose ( ref reference , options ) ;
@@ -107,6 +115,11 @@ public void UnregisterFromRuntime ()
107
115
108
116
public void Dispose ( )
109
117
{
118
+ if ( JniObjectInfo != IntPtr . Zero )
119
+ {
120
+ Marshal . FreeHGlobal ( JniObjectInfo ) ;
121
+ JniObjectInfo = IntPtr . Zero ;
122
+ }
110
123
JniEnvironment . Runtime . ValueManager . DisposePeer ( this ) ;
111
124
}
112
125
0 commit comments