Skip to content

Commit b75ad19

Browse files
committed
[Java.Interop] Avoid Type.GetType() in ManagedPeer
Fixes: #1165 Context: #1153 Context: #1157 When building for NativeAOT (#1153) or when building .NET Android apps with `-p:IsAotcompatible=true` (#1157), we get [IL2057][0] warnings from `ManagedPeer.cs`: ManagedPeer.cs(93,19,93,112): warning IL2057: Unrecognized value passed to the parameter 'typeName' of method 'System.Type.GetType(String, Boolean)'. It's not possible to guarantee the availability of the target type. ManagedPeer.cs(156,18,156,65): warning IL2057: Unrecognized value passed to the parameter 'typeName' of method 'System.Type.GetType(String, Boolean)'. It's not possible to guarantee the availability of the target type. ManagedPeer.cs(198,35,198,92): warning IL2057: Unrecognized value passed to the parameter 'typeName' of method 'System.Type.GetType(String, Boolean)'. It's not possible to guarantee the availability of the target type. These warnings are because `ManagedPeer.Construct()` and `ManagedPeer.RegisterNativeMembers()` use `Type.GetType()` on string values provided *from Java code*, and thus the IL trimmer does not have visibility into those strings, and thus cannot reliably determine which types need to be preserved: // Java Callable Wrapper /* partial */ class ManagedType { public static final String __md_methods; static { __md_methods = "n_GetString:()Ljava/lang/String;:__export__\n" + ""; net.dot.jni.ManagedPeer.registerNativeMembers ( /* nativeClass */ ManagedType.class, /* assemblyQualifiedName */ "Example.ManagedType, Hello-NativeAOTFromJNI", /* methods */ __md_methods); } public ManagedType (int p0) { super (); if (getClass () == ManagedType.class) { net.dot.jni.ManagedPeer.construct ( /* self */ this, /* assemblyQualifiedName */ "Example.ManagedType, Hello-NativeAOTFromJNI", /* constructorSignature */ "System.Int32, System.Runtime", /* arguments */ new java.lang.Object[] { p0 }); } } } `ManagedPeer.construct()` passes *two* sets of assembly-qualified type names: `assemblyQualifiedName` contains the type to construct, while `constructorSignature` contains a `:`-separated list of assembly-qualified type names for the constructor parameters. Each of these are passed to `Type.GetType()`. `ManagedPeer.registerNativeMembers()` passes an assembly-qualified type name to `ManagedPeer.RegisterNativeMembers()`, which passes the assembly-qualified type name to `Type.GetType()` to find the type to register native methods for. If we more strongly rely on JNI signatures, we can remove the need for Java Callable Wrappers to contain assembly-qualified type names entirely, thus removing the need for `ManagedPeer` to use `Type.GetType()`, removing the IL2057 warnings. For `ManagedPeer.construct()`, `assemblyQualifiedName` can be replaced with getting the JNI type signature from `self.getClass()`, and `constructorSignature` can be replaced with a *JNI method signature* of the calling constructor. For `ManagedPeer.registerNativeMembers()`, `assemblyQualifiedName` can be replaced with getting the JNI type signature from `nativeClass`. // Java Callable Wrapper /* partial */ class ManagedType { public static final String __md_methods; static { __md_methods = "n_GetString:()Ljava/lang/String;:__export__\n" + ""; net.dot.jni.ManagedPeer.registerNativeMembers ( /* nativeClass */ ManagedType.class, /* methods */ __md_methods); } public ManagedType (int p0) { super (); if (getClass () == ManagedType.class) { net.dot.jni.ManagedPeer.construct ( /* self */ this, /* constructorSignature */ "(I)V", /* arguments */ new java.lang.Object[] { p0 }); } } } Furthermore, if we add `[DynamicallyAccessedMembers]` to `JniRuntime.JniTypeManager.GetType()`, we can fix some [IL2075][1] warnings which appeared after fixing the IL2057 warnings. Aside: Excising assembly-qualified type names from Java Callable Wrappers had some "interesting" knock-on effects in the unit tests, requiring that more typemap information be explicitly provided. (This same information was *implicitly* provided before, via the provision of assembly-qualified type names everywhere…) [0]: https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trim-warnings/IL2057 [1]: https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trim-warnings/il2075
1 parent 8b85462 commit b75ad19

File tree

20 files changed

+109
-52
lines changed

20 files changed

+109
-52
lines changed

src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -825,9 +825,7 @@ void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, str
825825
case JavaPeerStyle.JavaInterop1:
826826
sw.Write ("net.dot.jni.ManagedPeer.registerNativeMembers (");
827827
sw.Write (self.name);
828-
sw.Write (".class, \"");
829-
sw.Write (managedTypeName);
830-
sw.Write ("\", ");
828+
sw.Write (".class, ");
831829
sw.Write (field);
832830
sw.WriteLine (");");
833831
break;
@@ -1025,9 +1023,7 @@ void GenerateConstructor (Signature ctor, TextWriter sw)
10251023
switch (CodeGenerationTarget) {
10261024
case JavaPeerStyle.JavaInterop1:
10271025
sw.Write ("net.dot.jni.ManagedPeer.construct (this, \"");
1028-
sw.Write (type.GetPartialAssemblyQualifiedName (cache));
1029-
sw.Write ("\", \"");
1030-
sw.Write (ctor.ManagedParameters);
1026+
sw.Write (ctor.JniSignature);
10311027
sw.Write ("\", new java.lang.Object[] { ");
10321028
sw.Write (ctor.ActivateCall);
10331029
sw.WriteLine (" });");

src/Java.Interop/Java.Interop/JavaProxyObject.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System;
44
using System.Diagnostics.CodeAnalysis;
55
using System.Runtime.CompilerServices;
6+
using System.Runtime.InteropServices;
67

78
namespace Java.Interop {
89

@@ -72,6 +73,7 @@ public override bool Equals (object? obj)
7273
}
7374

7475
// TODO: Keep in sync with the code generated by ExportedMemberBuilder
76+
[UnmanagedFunctionPointer (CallingConvention.Winapi)]
7577
delegate bool EqualsMarshalMethod (IntPtr jnienv, IntPtr n_self, IntPtr n_value);
7678
static bool Equals (IntPtr jnienv, IntPtr n_self, IntPtr n_value)
7779
{
@@ -92,6 +94,7 @@ static bool Equals (IntPtr jnienv, IntPtr n_self, IntPtr n_value)
9294
}
9395

9496
// TODO: Keep in sync with the code generated by ExportedMemberBuilder
97+
[UnmanagedFunctionPointer (CallingConvention.Winapi)]
9598
delegate int GetHashCodeMarshalMethod (IntPtr jnienv, IntPtr n_self);
9699
static int GetHashCode (IntPtr jnienv, IntPtr n_self)
97100
{
@@ -109,6 +112,7 @@ static int GetHashCode (IntPtr jnienv, IntPtr n_self)
109112
}
110113
}
111114

115+
[UnmanagedFunctionPointer (CallingConvention.Winapi)]
112116
delegate IntPtr ToStringMarshalMethod (IntPtr jnienv, IntPtr n_self);
113117
static IntPtr ToString (IntPtr jnienv, IntPtr n_self)
114118
{

src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ static Dictionary<string, Type> InitJniBuiltinSimpleReferenceToType ()
130130
{
131131
return new Dictionary<string, Type> (StringComparer.Ordinal) {
132132
{"java/lang/String", typeof (string)},
133+
{"net/dot/jni/internal/JavaProxyObject", typeof (JavaProxyObject)},
134+
{"net/dot/jni/internal/JavaProxyThrowable", typeof (JavaProxyThrowable)},
135+
{"net/dot/jni/ManagedPeer", typeof (ManagedPeer)},
133136
{"V", typeof (void)},
134137
{"Z", typeof (Boolean)},
135138
{"java/lang/Boolean", typeof (Boolean?)},
@@ -156,6 +159,7 @@ static KeyValuePair<Type, JniValueMarshaler>[] InitJniBuiltinMarshalers ()
156159
{
157160
return new []{
158161
new KeyValuePair<Type, JniValueMarshaler>(typeof (string), JniStringValueMarshaler.Instance),
162+
new KeyValuePair<Type, JniValueMarshaler>(typeof (JavaProxyObject), ProxyValueMarshaler.Instance),
159163
new KeyValuePair<Type, JniValueMarshaler>(typeof (Boolean), JniBooleanValueMarshaler.Instance),
160164
new KeyValuePair<Type, JniValueMarshaler>(typeof (Boolean?), JniNullableBooleanValueMarshaler.Instance),
161165
new KeyValuePair<Type, JniValueMarshaler>(typeof (SByte), JniSByteValueMarshaler.Instance),

src/Java.Interop/Java.Interop/JniBuiltinMarshalers.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ namespace Java.Interop {
101101
{
102102
return new Dictionary<string, Type> (StringComparer.Ordinal) {
103103
{"java/lang/String", typeof (string)},
104+
{"net/dot/jni/internal/JavaProxyObject", typeof (JavaProxyObject)},
105+
{"net/dot/jni/internal/JavaProxyThrowable", typeof (JavaProxyThrowable)},
106+
{"net/dot/jni/ManagedPeer", typeof (ManagedPeer)},
104107
{"V", typeof (void)},
105108
<#
106109
foreach (var type in types) {
@@ -119,6 +122,7 @@ namespace Java.Interop {
119122
{
120123
return new []{
121124
new KeyValuePair<Type, JniValueMarshaler>(typeof (string), JniStringValueMarshaler.Instance),
125+
new KeyValuePair<Type, JniValueMarshaler>(typeof (JavaProxyObject), ProxyValueMarshaler.Instance),
122126
<#
123127
foreach (var type in types) {
124128
#>

src/Java.Interop/Java.Interop/JniMemberSignature.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ public JniMemberSignature (string memberName, string memberSignature)
3434
this.memberSignature = memberSignature;
3535
}
3636

37+
internal static IEnumerable<JniTypeSignature> GetParameterTypesFromMethodSignature (string jniMethodSignature)
38+
{
39+
if (jniMethodSignature.Length < "()V".Length || jniMethodSignature [0] != '(' ) {
40+
throw new ArgumentException (
41+
$"Member signature `{jniMethodSignature}` is not a method signature. Method signatures must start with `(`.",
42+
nameof (jniMethodSignature));
43+
}
44+
int index = 1;
45+
while (index < jniMethodSignature.Length &&
46+
jniMethodSignature [index] != ')') {
47+
var (start, length) = ExtractType (jniMethodSignature, ref index);
48+
var jniType = jniMethodSignature.Substring (start, length);
49+
yield return JniTypeSignature.Parse (jniType);
50+
}
51+
}
52+
3753
public static int GetParameterCountFromMethodSignature (string jniMethodSignature)
3854
{
3955
if (jniMethodSignature.Length < "()V".Length || jniMethodSignature [0] != '(' ) {

src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,42 @@ internal JniInstanceMethods GetConstructorsForType (Type declaringType)
7272
if (declaringType == DeclaringType)
7373
return this;
7474

75+
JniInstanceMethods? methods;
76+
7577
lock (SubclassConstructors) {
76-
if (!SubclassConstructors.TryGetValue (declaringType, out var methods)) {
77-
methods = new JniInstanceMethods (declaringType);
78-
SubclassConstructors.Add (declaringType, methods);
79-
}
78+
if (SubclassConstructors.TryGetValue (declaringType, out methods))
79+
return methods;
80+
}
81+
// Init outside of `lock` in case we have recursive access:
82+
// System.ArgumentException: An item with the same key has already been added. Key: Java.Interop.JavaProxyThrowable
83+
// at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
84+
// at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
85+
// at Java.Interop.JniPeerMembers.JniInstanceMethods.GetConstructorsForType(Type declaringType) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 80
86+
// at Java.Interop.JniPeerMembers.JniInstanceMethods.GetConstructorsForType(Type declaringType) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 80
87+
// at Java.Interop.JniPeerMembers.JniInstanceMethods.StartCreateInstance(String constructorSignature, Type declaringType, JniArgumentValue* parameters) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 146
88+
// at Java.Interop.JavaException..ctor(String message) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JavaException.cs:line 52
89+
// at Java.Interop.JavaProxyThrowable..ctor(Exception exception) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JavaProxyThrowable.cs:line 15
90+
// at Java.Interop.JniEnvironment.Exceptions.Throw(Exception e) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniEnvironment.Errors.cs:line 39
91+
// at Java.Interop.JniRuntime.RaisePendingException(Exception pendingException) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniRuntime.cs:line 444
92+
// at Java.Interop.JniTransition.Dispose() in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniTransition.cs:line 39
93+
// at Java.Interop.ManagedPeer.RegisterNativeMembers(IntPtr jnienv, IntPtr klass, IntPtr n_nativeClass, IntPtr n_methods) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/ManagedPeer.cs:line 195
94+
// at Java.Interop.NativeMethods.java_interop_jnienv_find_class(IntPtr jnienv, IntPtr& thrown, String classname)
95+
// at Java.Interop.NativeMethods.java_interop_jnienv_find_class(IntPtr jnienv, IntPtr& thrown, String classname)
96+
// at Java.Interop.JniEnvironment.Types.TryRawFindClass(IntPtr env, String classname, IntPtr& klass, IntPtr& thrown) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs:line 135
97+
// at Java.Interop.JniEnvironment.Types.TryFindClass(String classname, Boolean throwOnError) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs:line 49
98+
// at Java.Interop.JniEnvironment.Types.FindClass(String classname) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs:line 37
99+
// at Java.Interop.JniType..ctor(String classname) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniType.cs:line 51
100+
// at Java.Interop.JniPeerMembers.JniInstanceMethods..ctor(Type declaringType) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 27
101+
// at Java.Interop.JniPeerMembers.JniInstanceMethods.GetConstructorsForType(Type declaringType) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 77
102+
// at Java.Interop.JniPeerMembers.JniInstanceMethods.StartCreateInstance(String constructorSignature, Type declaringType, JniArgumentValue* parameters) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs:line 146
103+
// at Java.Lang.Object..ctor() in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Base/obj/Debug-net7.0/mcw/Java.Lang.Object.cs:line 32
104+
// at Java.BaseTests.MyIntConsumer..ctor(Action`1 action) in /Users/jon/Developer/src/xamarin/java.interop/tests/Java.Base-Tests/Java.Base/JavaToManagedTests.cs:line 77
105+
// at Java.BaseTests.JavaToManagedTests.InterfaceInvokerMethod() in /Users/jon/Developer/src/xamarin/java.interop/tests/Java.Base-Tests/Java.Base/JavaToManagedTests.cs:line 26
106+
methods = new JniInstanceMethods (declaringType);
107+
lock (SubclassConstructors) {
108+
if (SubclassConstructors.TryGetValue (declaringType, out var m))
109+
return m;
110+
SubclassConstructors.Add (declaringType, methods);
80111
return methods;
81112
}
82113
}

src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ protected virtual IEnumerable<string> GetSimpleReferences (Type type)
267267
static readonly Type[] EmptyTypeArray = Array.Empty<Type> ();
268268

269269

270+
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
270271
public Type? GetType (JniTypeSignature typeSignature)
271272
{
272273
AssertValid ();

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

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
using System;
44
using System.Diagnostics;
5+
using System.Diagnostics.CodeAnalysis;
56
using System.Linq;
67
using System.Linq.Expressions;
78
using System.Reflection;
@@ -47,20 +48,18 @@ public override JniPeerMembers JniPeerMembers {
4748
get {return _members;}
4849
}
4950

50-
const string ConstructSignature = "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V";
51+
const string ConstructSignature = "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V";
5152

5253
// TODO: Keep in sync with the code generated by ExportedMemberBuilder
5354
delegate void ConstructMarshalMethod (IntPtr jnienv,
5455
IntPtr klass,
5556
IntPtr n_self,
56-
IntPtr n_assemblyQualifiedName,
5757
IntPtr n_constructorSignature,
5858
IntPtr n_constructorArguments);
5959
static void Construct (
6060
IntPtr jnienv,
6161
IntPtr klass,
6262
IntPtr n_self,
63-
IntPtr n_assemblyQualifiedName,
6463
IntPtr n_constructorSignature,
6564
IntPtr n_constructorArguments)
6665
{
@@ -90,14 +89,16 @@ static void Construct (
9089
return;
9190
}
9291

93-
var type = Type.GetType (JniEnvironment.Strings.ToString (n_assemblyQualifiedName)!, throwOnError: true)!;
92+
var typeSig = new JniTypeSignature (JniEnvironment.Types.GetJniTypeNameFromInstance (r_self));
93+
var type = GetTypeFromSignature (runtime.TypeManager, typeSig);
94+
9495
if (type.IsGenericTypeDefinition) {
9596
throw new NotSupportedException (
9697
"Constructing instances of generic types from Java is not supported, as the type parameters cannot be determined.",
9798
CreateJniLocationException ());
9899
}
99100

100-
var ptypes = GetParameterTypes (JniEnvironment.Strings.ToString (n_constructorSignature));
101+
var ptypes = GetParameterTypes (runtime.TypeManager, JniEnvironment.Strings.ToString (n_constructorSignature));
101102
var pvalues = GetValues (runtime, new JniObjectReference (n_constructorArguments), ptypes);
102103
var cinfo = type.GetConstructor (ptypes);
103104
if (cinfo == null) {
@@ -146,14 +147,15 @@ static Exception CreateJniLocationException ()
146147
}
147148
}
148149

149-
static Type[] GetParameterTypes (string? signature)
150+
static Type[] GetParameterTypes (JniRuntime.JniTypeManager typeMgr, string? signature)
150151
{
151152
if (string.IsNullOrEmpty (signature))
152153
return Array.Empty<Type> ();
153-
var typeNames = signature!.Split (':');
154-
var ptypes = new Type [typeNames.Length];
155-
for (int i = 0; i < typeNames.Length; i++)
156-
ptypes [i] = Type.GetType (typeNames [i], throwOnError:true)!;
154+
var ptypes = new Type [JniMemberSignature.GetParameterCountFromMethodSignature (signature)];
155+
int i = 0;
156+
foreach (var jniType in JniMemberSignature.GetParameterTypesFromMethodSignature (signature)) {
157+
ptypes [i++] = GetTypeFromSignature (typeMgr, jniType, signature);
158+
}
157159
return ptypes;
158160
}
159161

@@ -175,31 +177,31 @@ static Type[] GetParameterTypes (string? signature)
175177
return pvalues;
176178
}
177179

178-
const string RegisterNativeMembersSignature = "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)V";
180+
const string RegisterNativeMembersSignature = "(Ljava/lang/Class;Ljava/lang/String;)V";
179181

180182
delegate void RegisterMarshalMethod (IntPtr jnienv,
181183
IntPtr klass,
182184
IntPtr n_nativeClass,
183-
IntPtr n_assemblyQualifiedName,
184185
IntPtr n_methods);
185186
static unsafe void RegisterNativeMembers (
186187
IntPtr jnienv,
187188
IntPtr klass,
188189
IntPtr n_nativeClass,
189-
IntPtr n_assemblyQualifiedName,
190190
IntPtr n_methods)
191191
{
192192
var envp = new JniTransition (jnienv);
193193
try {
194194
var r_nativeClass = new JniObjectReference (n_nativeClass);
195+
#pragma warning disable CA2000
195196
var nativeClass = new JniType (ref r_nativeClass, JniObjectReferenceOptions.Copy);
197+
#pragma warning restore CA2000
196198

197-
var assemblyQualifiedName = JniEnvironment.Strings.ToString (new JniObjectReference (n_assemblyQualifiedName));
198-
var type = Type.GetType (assemblyQualifiedName!, throwOnError: true)!;
199199
var methodsRef = new JniObjectReference (n_methods);
200200

201-
#if NET
201+
var typeSig = new JniTypeSignature (nativeClass.Name);
202+
var type = GetTypeFromSignature (JniEnvironment.Runtime.TypeManager, typeSig);
202203

204+
#if NET
203205
int methodsLength = JniEnvironment.Strings.GetStringLength (methodsRef);
204206
var methodsChars = JniEnvironment.Strings.GetStringChars (methodsRef, null);
205207
var methods = new ReadOnlySpan<char>(methodsChars, methodsLength);
@@ -223,6 +225,13 @@ static unsafe void RegisterNativeMembers (
223225
envp.Dispose ();
224226
}
225227
}
228+
229+
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
230+
static Type GetTypeFromSignature (JniRuntime.JniTypeManager typeManager, JniTypeSignature typeSignature, string? context = null)
231+
{
232+
return typeManager.GetType (typeSignature) ??
233+
throw new NotSupportedException ($"Could not find System.Type corresponding to Java type {typeSignature} {(context == null ? "" : "within `" + context + "`")}.");
234+
}
226235
}
227236

228237
sealed class JniLocationException : Exception {

src/Java.Interop/java/net/dot/jni/ManagedPeer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ private ManagedPeer () {
66

77
public static native void registerNativeMembers (
88
java.lang.Class<?> nativeClass,
9-
String assemblyQualifiedName,
109
String methods);
1110

1211
public static native void construct (
1312
Object self,
14-
String assemblyQualifiedName,
1513
String constructorSignature,
1614
Object... arguments
1715
);

src/Java.Interop/java/net/dot/jni/internal/JavaProxyObject.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
extends java.lang.Object
99
implements GCUserPeerable
1010
{
11-
static final String assemblyQualifiedName = "Java.Interop.JavaProxyObject, Java.Interop";
1211
static {
1312
net.dot.jni.ManagedPeer.registerNativeMembers (
1413
JavaProxyObject.class,
15-
assemblyQualifiedName,
1614
"");
1715
}
1816

0 commit comments

Comments
 (0)