Skip to content

Commit 31045b8

Browse files
committed
Address feedback.
If `IJavaPeerable.PeerReference` isn't valid, return null.
1 parent 647a22b commit 31045b8

File tree

6 files changed

+16
-8
lines changed

6 files changed

+16
-8
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ namespace Java.Interop
88
[JniTypeSignature ("java/lang/Object", GenerateJavaPeer=false)]
99
unsafe public class JavaObject : IJavaPeerable
1010
{
11-
internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces;
11+
internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors;
12+
internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = Constructors | DynamicallyAccessedMemberTypes.Interfaces;
1213

1314
readonly static JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (JavaObject));
1415

src/Java.Interop/Java.Interop/JavaPeerableExtensions.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,19 @@ public static bool TryJavaCast<
2424
}
2525

2626
public static TResult? JavaAs<
27-
[DynamicallyAccessedMembers (JavaObject.ConstructorsAndInterfaces)]
27+
[DynamicallyAccessedMembers (JavaObject.Constructors)]
2828
TResult
2929
> (this IJavaPeerable? self)
3030
where TResult : class, IJavaPeerable
3131
{
32-
if (self == null) {
32+
if (self == null || !self.PeerReference.IsValid) {
3333
return null;
3434
}
3535

3636
if (self is TResult result) {
3737
return result;
3838
}
3939

40-
if (!self.PeerReference.IsValid) {
41-
throw new ObjectDisposedException (self.GetType ().FullName);
42-
}
43-
4440
var r = self.PeerReference;
4541
return JniEnvironment.Runtime.ValueManager.CreatePeer (
4642
ref r, JniObjectReferenceOptions.Copy,

src/Java.Interop/Java.Interop/ManagedPeer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ namespace Java.Interop {
1818
/* static */ sealed class ManagedPeer : JavaObject {
1919

2020
internal const string JniTypeName = "net/dot/jni/ManagedPeer";
21-
internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors;
2221
internal const DynamicallyAccessedMemberTypes ConstructorsMethodsNestedTypes = Constructors | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.NonPublicNestedTypes;
2322

2423

tests/Java.Interop-Tests/Java.Interop/JavaPeerableExtensionsTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ public void JavaAs_NullSelfReturnsNull ()
3535
Assert.AreEqual (null, JavaPeerableExtensions.JavaAs<IAndroidInterface> (null));
3636
}
3737

38+
public void JavaAs_InvalidPeerRefReturnsNull ()
39+
{
40+
var v = new MyJavaInterfaceImpl ();
41+
v.Dispose ();
42+
Assert.AreEqual (null, JavaPeerableExtensions.JavaAs<IJavaInterface> (v));
43+
}
44+
3845
[Test]
3946
public void JavaAs_InstanceThatDoesNotImplementInterfaceReturnsNull ()
4047
{
@@ -83,6 +90,7 @@ public string Value {
8390
}
8491
}
8592

93+
[JniTypeSignature (IJavaInterface.JniTypeName, GenerateJavaPeer=false)]
8694
internal class IJavaInterfaceInvoker : JavaObject, IJavaInterface {
8795

8896
internal static readonly JniPeerMembers _members = new JniPeerMembers (IJavaInterface.JniTypeName, typeof (IJavaInterfaceInvoker));

tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@ class JavaVMFixtureTypeManager : JniRuntime.JniTypeManager {
4141
[CallVirtualFromConstructorDerived.JniTypeName] = typeof (CallVirtualFromConstructorDerived),
4242
[CrossReferenceBridge.JniTypeName] = typeof (CrossReferenceBridge),
4343
[GetThis.JniTypeName] = typeof (GetThis),
44+
[IAndroidInterface.JniTypeName] = typeof (IAndroidInterface),
45+
[IJavaInterface.JniTypeName] = typeof (IJavaInterface),
4446
[JavaDisposedObject.JniTypeName] = typeof (JavaDisposedObject),
4547
[JavaObjectWithMissingJavaPeer.JniTypeName] = typeof (JavaObjectWithMissingJavaPeer),
4648
[MyDisposableObject.JniTypeName] = typeof (JavaDisposedObject),
49+
[MyJavaInterfaceImpl.JniTypeName] = typeof (MyJavaInterfaceImpl),
4750
};
4851

4952
public JavaVMFixtureTypeManager ()

tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ public static unsafe string getClassName ()
273273
}
274274
}
275275

276+
[JniTypeSignature (IAndroidInterface.JniTypeName, GenerateJavaPeer=false)]
276277
internal class IAndroidInterfaceInvoker : JavaObject, IAndroidInterface {
277278

278279
public override JniPeerMembers JniPeerMembers => IAndroidInterface._members;

0 commit comments

Comments
 (0)