Skip to content

Commit 53626b7

Browse files
committed
[Java.Interop-Tests] Add test for JniMarshalMethod return type handling.
I'm trying to migrate Java.Interop.Export to use JniEnvironment, and hitting errors regarding System.Linq.Expressions use when methods have non-`void` return types. Since the Java.Interop.Export code is based in part on JniMarshalMethod, add a test for a method with a non-`void` return type for more sanity checking.
1 parent 2f9fece commit 53626b7

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

src/Java.Interop/Tests/Java.Interop/JniMarshalMethodTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,34 @@ public void CreateMarshalMethodExpression ()
4545
}");
4646
}
4747

48+
[Test]
49+
public void CreateMarshalMethodExpression_GetStringValueHandler ()
50+
{
51+
var t = typeof (Func<IntPtr, IntPtr, int, IntPtr>);
52+
var m = typeof (TestType).GetMethod ("GetStringValueHandler", BindingFlags.NonPublic | BindingFlags.Static);
53+
var d = Delegate.CreateDelegate (t, m);
54+
CheckCreateMarshalMethodExpression (d, t,
55+
@"IntPtr (IntPtr arg1, IntPtr arg2, int arg3)
56+
{
57+
JniEnvironment __envp;
58+
59+
__envp = new JniEnvironment(arg1);
60+
try
61+
{
62+
return TestType.GetStringValueHandler(arg1, arg2, arg3);
63+
}
64+
catch (Exception __e)
65+
{
66+
__envp.SetPendingException(__e);
67+
return default(IntPtr);
68+
}
69+
finally
70+
{
71+
__envp.Dispose();
72+
}
73+
}");
74+
}
75+
4876
static void CheckCreateMarshalMethodExpression (Delegate value, Type expectedDelegateType, string expectedBody)
4977
{
5078
var l = JniMarshalMethod.CreateMarshalMethodExpression (value);

src/Java.Interop/Tests/Java.Interop/TestType.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static TestType ()
1818
_members.JniPeerType.RegisterNativeMethods (
1919
new JniNativeMethodRegistration ("equalsThis", "(Ljava/lang/Object;)Z", GetEqualsThisHandler ()),
2020
new JniNativeMethodRegistration ("getInt32Value", "()I", GetInt32ValueHandler ()),
21-
new JniNativeMethodRegistration ("getStringValue", "(I)Ljava/lang/String;", GetStringValueHandler ()),
21+
new JniNativeMethodRegistration ("getStringValue", "(I)Ljava/lang/String;", _GetStringValueHandler ()),
2222
new JniNativeMethodRegistration ("methodThrows", "()V", (Action<IntPtr, IntPtr>) MethodThrowsHandler));
2323
}
2424

@@ -111,21 +111,24 @@ static Delegate GetInt32ValueHandler ()
111111
return h;
112112
}
113113

114-
static Delegate GetStringValueHandler ()
114+
static Delegate _GetStringValueHandler ()
115115
{
116-
Func<IntPtr, IntPtr, int, IntPtr> h = (jnienv, n_self, value) => {
117-
var self = JniEnvironment.Current.JavaVM.GetObject<TestType>(n_self);
118-
try {
119-
var s = self.GetStringValue (value);
120-
using (var r = JniEnvironment.Strings.NewString (s))
121-
return JniEnvironment.Handles.NewReturnToJniRef (r);
122-
} finally {
123-
self.DisposeUnlessRegistered ();
124-
}
125-
};
116+
Func<IntPtr, IntPtr, int, IntPtr> h = GetStringValueHandler;
126117
return h;
127118
}
128119

120+
static IntPtr GetStringValueHandler (IntPtr jnienv, IntPtr n_self, int value)
121+
{
122+
var self = JniEnvironment.Current.JavaVM.GetObject<TestType>(n_self);
123+
try {
124+
var s = self.GetStringValue (value);
125+
using (var r = JniEnvironment.Strings.NewString (s))
126+
return JniEnvironment.Handles.NewReturnToJniRef (r);
127+
} finally {
128+
self.DisposeUnlessRegistered ();
129+
}
130+
}
131+
129132
static void MethodThrowsHandler (IntPtr jnienv, IntPtr n_self)
130133
{
131134
var self = JniEnvironment.Current.JavaVM.GetObject<TestType> (n_self);

0 commit comments

Comments
 (0)