Skip to content

Commit f6cfcab

Browse files
WIP JniObjectInfo struct
Context: dotnet/android#10125 (comment)
1 parent d07ed32 commit f6cfcab

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

src/Java.Interop/Java.Interop/JavaObject.cs

+23-10
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@
22

33
using System;
44
using System.Diagnostics.CodeAnalysis;
5+
using System.Runtime.CompilerServices;
6+
using System.Runtime.InteropServices;
57
using System.Runtime.Serialization;
68

79
namespace 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

Comments
 (0)