-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathJavaObject.cs
More file actions
165 lines (136 loc) · 4.59 KB
/
JavaObject.cs
File metadata and controls
165 lines (136 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#nullable enable
using System;
namespace Java.Interop
{
[JniTypeSignature ("java/lang/Object", GenerateJavaPeer=false)]
unsafe public class JavaObject : IJavaPeerable
{
readonly static JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (JavaObject));
public int JniIdentityHashCode { get; private set; }
public JniManagedPeerStates JniManagedPeerState { get; private set; }
#if FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
JniObjectReference reference;
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
IntPtr handle;
JniObjectReferenceType handle_type;
#pragma warning disable 0169
// Used by JavaInteropGCBridge
IntPtr weak_handle;
int refs_added;
#pragma warning restore 0169
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
protected static readonly JniObjectReference* InvalidJniObjectReference = null;
~JavaObject ()
{
JniEnvironment.Runtime.ValueManager.FinalizePeer (this);
}
public JniObjectReference PeerReference {
get {
#if FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
return reference;
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
return new JniObjectReference (handle, handle_type);
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
}
}
// Note: JniPeerMembers is invoked virtually from the constructor;
// it MUST be valid before the derived constructor executes!
// The pattern MUST be followed.
public virtual JniPeerMembers JniPeerMembers {
get {return _members;}
}
public JavaObject (ref JniObjectReference reference, JniObjectReferenceOptions options)
{
Construct (ref reference, options);
}
public unsafe JavaObject ()
: this (ref *InvalidJniObjectReference, JniObjectReferenceOptions.None)
{
if (PeerReference.IsValid)
return;
var peer = JniPeerMembers.InstanceMethods.StartCreateInstance ("()V", GetType (), null);
Construct (ref peer, JniObjectReferenceOptions.CopyAndDispose);
JniPeerMembers.InstanceMethods.FinishCreateInstance ("()V", this, null);
}
protected void Construct (ref JniObjectReference reference, JniObjectReferenceOptions options)
{
JniEnvironment.Runtime.ValueManager.ConstructPeer (this, ref reference, options);
}
protected void SetPeerReference (ref JniObjectReference reference, JniObjectReferenceOptions options)
{
if (options == JniObjectReferenceOptions.None) {
((IJavaPeerable) this).SetPeerReference (new JniObjectReference ());
return;
}
#if FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
this.reference = reference;
#endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES
#if FEATURE_JNIOBJECTREFERENCE_INTPTRS
this.handle = reference.Handle;
this.handle_type = reference.Type;
#endif // FEATURE_JNIOBJECTREFERENCE_INTPTRS
JniObjectReference.Dispose (ref reference, options);
}
public void UnregisterFromRuntime ()
{
if (!PeerReference.IsValid)
throw new ObjectDisposedException (GetType ().FullName);
JniEnvironment.Runtime.ValueManager.RemovePeer (this);
}
public void Dispose ()
{
JniEnvironment.Runtime.ValueManager.DisposePeer (this);
}
public virtual void DisposeUnlessReferenced ()
{
JniEnvironment.Runtime.ValueManager.DisposePeerUnlessReferenced (this);
}
protected virtual void Dispose (bool disposing)
{
}
public override bool Equals (object? obj)
{
JniPeerMembers.AssertSelf (this);
if (object.ReferenceEquals (obj, this))
return true;
var o = obj as IJavaPeerable;
if (o != null)
return JniEnvironment.Types.IsSameObject (PeerReference, o.PeerReference);
return false;
}
public override unsafe int GetHashCode ()
{
return _members.InstanceMethods.InvokeVirtualInt32Method ("hashCode.()I", this, null);
}
public override unsafe string? ToString ()
{
var lref = _members.InstanceMethods.InvokeVirtualObjectMethod (
"toString.()Ljava/lang/String;",
this,
null);
return JniEnvironment.Strings.ToString (ref lref, JniObjectReferenceOptions.CopyAndDispose);
}
void IJavaPeerable.Disposed ()
{
Dispose (disposing: true);
}
void IJavaPeerable.Finalized ()
{
Dispose (disposing: false);
}
void IJavaPeerable.SetJniIdentityHashCode (int value)
{
JniIdentityHashCode = value;
}
void IJavaPeerable.SetJniManagedPeerState (JniManagedPeerStates value)
{
JniManagedPeerState = value;
}
void IJavaPeerable.SetPeerReference (JniObjectReference reference)
{
SetPeerReference (ref reference, JniObjectReferenceOptions.Copy);
}
}
}