diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs index 59d434ed0..e103e9958 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs @@ -825,9 +825,7 @@ void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, str case JavaPeerStyle.JavaInterop1: sw.Write ("net.dot.jni.ManagedPeer.registerNativeMembers ("); sw.Write (self.name); - sw.Write (".class, \""); - sw.Write (managedTypeName); - sw.Write ("\", "); + sw.Write (".class, "); sw.Write (field); sw.WriteLine (");"); break; @@ -1025,9 +1023,7 @@ void GenerateConstructor (Signature ctor, TextWriter sw) switch (CodeGenerationTarget) { case JavaPeerStyle.JavaInterop1: sw.Write ("net.dot.jni.ManagedPeer.construct (this, \""); - sw.Write (type.GetPartialAssemblyQualifiedName (cache)); - sw.Write ("\", \""); - sw.Write (ctor.ManagedParameters); + sw.Write (ctor.JniSignature); sw.Write ("\", new java.lang.Object[] { "); sw.Write (ctor.ActivateCall); sw.WriteLine (" });"); diff --git a/src/Java.Interop/Java.Interop/JavaProxyObject.cs b/src/Java.Interop/Java.Interop/JavaProxyObject.cs index 00f0ff86d..28f48ef7a 100644 --- a/src/Java.Interop/Java.Interop/JavaProxyObject.cs +++ b/src/Java.Interop/Java.Interop/JavaProxyObject.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace Java.Interop { @@ -72,6 +73,7 @@ public override bool Equals (object? obj) } // TODO: Keep in sync with the code generated by ExportedMemberBuilder + [UnmanagedFunctionPointer (CallingConvention.Winapi)] delegate bool EqualsMarshalMethod (IntPtr jnienv, IntPtr n_self, IntPtr n_value); static bool Equals (IntPtr jnienv, IntPtr n_self, IntPtr n_value) { @@ -92,6 +94,7 @@ static bool Equals (IntPtr jnienv, IntPtr n_self, IntPtr n_value) } // TODO: Keep in sync with the code generated by ExportedMemberBuilder + [UnmanagedFunctionPointer (CallingConvention.Winapi)] delegate int GetHashCodeMarshalMethod (IntPtr jnienv, IntPtr n_self); static int GetHashCode (IntPtr jnienv, IntPtr n_self) { @@ -109,6 +112,7 @@ static int GetHashCode (IntPtr jnienv, IntPtr n_self) } } + [UnmanagedFunctionPointer (CallingConvention.Winapi)] delegate IntPtr ToStringMarshalMethod (IntPtr jnienv, IntPtr n_self); static IntPtr ToString (IntPtr jnienv, IntPtr n_self) { diff --git a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs index fd6b78712..b75e46b6d 100644 --- a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs +++ b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs @@ -130,6 +130,9 @@ static Dictionary InitJniBuiltinSimpleReferenceToType () { return new Dictionary (StringComparer.Ordinal) { {"java/lang/String", typeof (string)}, + {"net/dot/jni/internal/JavaProxyObject", typeof (JavaProxyObject)}, + {"net/dot/jni/internal/JavaProxyThrowable", typeof (JavaProxyThrowable)}, + {"net/dot/jni/ManagedPeer", typeof (ManagedPeer)}, {"V", typeof (void)}, {"Z", typeof (Boolean)}, {"java/lang/Boolean", typeof (Boolean?)}, @@ -156,6 +159,7 @@ static KeyValuePair[] InitJniBuiltinMarshalers () { return new []{ new KeyValuePair(typeof (string), JniStringValueMarshaler.Instance), + new KeyValuePair(typeof (JavaProxyObject), ProxyValueMarshaler.Instance), new KeyValuePair(typeof (Boolean), JniBooleanValueMarshaler.Instance), new KeyValuePair(typeof (Boolean?), JniNullableBooleanValueMarshaler.Instance), new KeyValuePair(typeof (SByte), JniSByteValueMarshaler.Instance), diff --git a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.tt b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.tt index a3cf69968..d5910cf62 100644 --- a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.tt +++ b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.tt @@ -101,6 +101,9 @@ namespace Java.Interop { { return new Dictionary (StringComparer.Ordinal) { {"java/lang/String", typeof (string)}, + {"net/dot/jni/internal/JavaProxyObject", typeof (JavaProxyObject)}, + {"net/dot/jni/internal/JavaProxyThrowable", typeof (JavaProxyThrowable)}, + {"net/dot/jni/ManagedPeer", typeof (ManagedPeer)}, {"V", typeof (void)}, <# foreach (var type in types) { @@ -119,6 +122,7 @@ namespace Java.Interop { { return new []{ new KeyValuePair(typeof (string), JniStringValueMarshaler.Instance), + new KeyValuePair(typeof (JavaProxyObject), ProxyValueMarshaler.Instance), <# foreach (var type in types) { #> diff --git a/src/Java.Interop/Java.Interop/JniMemberSignature.cs b/src/Java.Interop/Java.Interop/JniMemberSignature.cs index 946cf7bb5..30ba2b4c5 100644 --- a/src/Java.Interop/Java.Interop/JniMemberSignature.cs +++ b/src/Java.Interop/Java.Interop/JniMemberSignature.cs @@ -34,6 +34,22 @@ public JniMemberSignature (string memberName, string memberSignature) this.memberSignature = memberSignature; } + internal static IEnumerable GetParameterTypesFromMethodSignature (string jniMethodSignature) + { + if (jniMethodSignature.Length < "()V".Length || jniMethodSignature [0] != '(' ) { + throw new ArgumentException ( + $"Member signature `{jniMethodSignature}` is not a method signature. Method signatures must start with `(`.", + nameof (jniMethodSignature)); + } + int index = 1; + while (index < jniMethodSignature.Length && + jniMethodSignature [index] != ')') { + var (start, length) = ExtractType (jniMethodSignature, ref index); + var jniType = jniMethodSignature.Substring (start, length); + yield return JniTypeSignature.Parse (jniType); + } + } + public static int GetParameterCountFromMethodSignature (string jniMethodSignature) { if (jniMethodSignature.Length < "()V".Length || jniMethodSignature [0] != '(' ) { diff --git a/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs b/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs index cee7af696..04d96870e 100644 --- a/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs +++ b/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs @@ -72,11 +72,42 @@ internal JniInstanceMethods GetConstructorsForType (Type declaringType) if (declaringType == DeclaringType) return this; + JniInstanceMethods? methods; + lock (SubclassConstructors) { - if (!SubclassConstructors.TryGetValue (declaringType, out var methods)) { - methods = new JniInstanceMethods (declaringType); - SubclassConstructors.Add (declaringType, methods); - } + if (SubclassConstructors.TryGetValue (declaringType, out methods)) + return methods; + } + // Init outside of `lock` in case we have recursive access: + // System.ArgumentException: An item with the same key has already been added. Key: Java.Interop.JavaProxyThrowable + // at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior) + // at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) + // 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 + // 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 + // 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 + // at Java.Interop.JavaException..ctor(String message) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JavaException.cs:line 52 + // at Java.Interop.JavaProxyThrowable..ctor(Exception exception) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JavaProxyThrowable.cs:line 15 + // 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 + // at Java.Interop.JniRuntime.RaisePendingException(Exception pendingException) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniRuntime.cs:line 444 + // at Java.Interop.JniTransition.Dispose() in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniTransition.cs:line 39 + // 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 + // at Java.Interop.NativeMethods.java_interop_jnienv_find_class(IntPtr jnienv, IntPtr& thrown, String classname) + // at Java.Interop.NativeMethods.java_interop_jnienv_find_class(IntPtr jnienv, IntPtr& thrown, String classname) + // 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 + // 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 + // 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 + // at Java.Interop.JniType..ctor(String classname) in /Users/jon/Developer/src/xamarin/java.interop/src/Java.Interop/Java.Interop/JniType.cs:line 51 + // 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 + // 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 + // 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 + // 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 + // 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 + // at Java.BaseTests.JavaToManagedTests.InterfaceInvokerMethod() in /Users/jon/Developer/src/xamarin/java.interop/tests/Java.Base-Tests/Java.Base/JavaToManagedTests.cs:line 26 + methods = new JniInstanceMethods (declaringType); + lock (SubclassConstructors) { + if (SubclassConstructors.TryGetValue (declaringType, out var m)) + return m; + SubclassConstructors.Add (declaringType, methods); return methods; } } diff --git a/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs b/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs index e87e9b129..616f9ed67 100644 --- a/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs +++ b/src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs @@ -267,6 +267,7 @@ protected virtual IEnumerable GetSimpleReferences (Type type) static readonly Type[] EmptyTypeArray = Array.Empty (); + [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public Type? GetType (JniTypeSignature typeSignature) { AssertValid (); diff --git a/src/Java.Interop/Java.Interop/ManagedPeer.cs b/src/Java.Interop/Java.Interop/ManagedPeer.cs index 7df4134f8..b2761d9b6 100644 --- a/src/Java.Interop/Java.Interop/ManagedPeer.cs +++ b/src/Java.Interop/Java.Interop/ManagedPeer.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -47,20 +48,18 @@ public override JniPeerMembers JniPeerMembers { get {return _members;} } - const string ConstructSignature = "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V"; + const string ConstructSignature = "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V"; // TODO: Keep in sync with the code generated by ExportedMemberBuilder delegate void ConstructMarshalMethod (IntPtr jnienv, IntPtr klass, IntPtr n_self, - IntPtr n_assemblyQualifiedName, IntPtr n_constructorSignature, IntPtr n_constructorArguments); static void Construct ( IntPtr jnienv, IntPtr klass, IntPtr n_self, - IntPtr n_assemblyQualifiedName, IntPtr n_constructorSignature, IntPtr n_constructorArguments) { @@ -90,7 +89,9 @@ static void Construct ( return; } - var type = Type.GetType (JniEnvironment.Strings.ToString (n_assemblyQualifiedName)!, throwOnError: true)!; + var typeSig = new JniTypeSignature (JniEnvironment.Types.GetJniTypeNameFromInstance (r_self)); + var type = GetTypeFromSignature (typeMgr, typeSig); + if (type.IsGenericTypeDefinition) { throw new NotSupportedException ( "Constructing instances of generic types from Java is not supported, as the type parameters cannot be determined.", @@ -150,10 +151,11 @@ static Type[] GetParameterTypes (string? signature) { if (string.IsNullOrEmpty (signature)) return Array.Empty (); - var typeNames = signature!.Split (':'); - var ptypes = new Type [typeNames.Length]; - for (int i = 0; i < typeNames.Length; i++) - ptypes [i] = Type.GetType (typeNames [i], throwOnError:true)!; + var ptypes = new Type [JniMemberSignature.GetParameterCountFromMethodSignature (signature)]; + int i = 0; + foreach (var jniType in JniMemberSignature.GetParameterTypesFromMethodSignature (signature)) { + ptypes [i++] = GetTypeFromSignature (typeMgr, jniType, signature); + } return ptypes; } @@ -175,31 +177,31 @@ static Type[] GetParameterTypes (string? signature) return pvalues; } - const string RegisterNativeMembersSignature = "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)V"; + const string RegisterNativeMembersSignature = "(Ljava/lang/Class;Ljava/lang/String;)V"; delegate void RegisterMarshalMethod (IntPtr jnienv, IntPtr klass, IntPtr n_nativeClass, - IntPtr n_assemblyQualifiedName, IntPtr n_methods); static unsafe void RegisterNativeMembers ( IntPtr jnienv, IntPtr klass, IntPtr n_nativeClass, - IntPtr n_assemblyQualifiedName, IntPtr n_methods) { var envp = new JniTransition (jnienv); try { var r_nativeClass = new JniObjectReference (n_nativeClass); +#pragma warning disable CA2000 var nativeClass = new JniType (ref r_nativeClass, JniObjectReferenceOptions.Copy); +#pragma warning restore CA2000 - var assemblyQualifiedName = JniEnvironment.Strings.ToString (new JniObjectReference (n_assemblyQualifiedName)); - var type = Type.GetType (assemblyQualifiedName!, throwOnError: true)!; var methodsRef = new JniObjectReference (n_methods); -#if NET + var typeSig = new JniTypeSignature (nativeClass.Name); + var type = GetTypeFromSignature (JniEnvironment.Runtime.TypeManager, typeSig); +#if NET int methodsLength = JniEnvironment.Strings.GetStringLength (methodsRef); var methodsChars = JniEnvironment.Strings.GetStringChars (methodsRef, null); var methods = new ReadOnlySpan(methodsChars, methodsLength); @@ -223,6 +225,13 @@ static unsafe void RegisterNativeMembers ( envp.Dispose (); } } + + [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + static Type GetTypeFromSignature (JniRuntime.JniTypeManager typeManager, JniTypeSignature typeSignature, string? context = null) + { + return typeManager.GetType (typeSignature) ?? + throw new NotSupportedException ($"Could not find System.Type corresponding to Java type {typeSignature} {(context == null ? "" : "within `" + context + "`")}."); + } } sealed class JniLocationException : Exception { diff --git a/src/Java.Interop/java/net/dot/jni/ManagedPeer.java b/src/Java.Interop/java/net/dot/jni/ManagedPeer.java index 50ff8aae6..dc66d3122 100644 --- a/src/Java.Interop/java/net/dot/jni/ManagedPeer.java +++ b/src/Java.Interop/java/net/dot/jni/ManagedPeer.java @@ -6,12 +6,10 @@ private ManagedPeer () { public static native void registerNativeMembers ( java.lang.Class nativeClass, - String assemblyQualifiedName, String methods); public static native void construct ( Object self, - String assemblyQualifiedName, String constructorSignature, Object... arguments ); diff --git a/src/Java.Interop/java/net/dot/jni/internal/JavaProxyObject.java b/src/Java.Interop/java/net/dot/jni/internal/JavaProxyObject.java index 5e7122789..013cb0708 100644 --- a/src/Java.Interop/java/net/dot/jni/internal/JavaProxyObject.java +++ b/src/Java.Interop/java/net/dot/jni/internal/JavaProxyObject.java @@ -8,11 +8,9 @@ extends java.lang.Object implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.Interop.JavaProxyObject, Java.Interop"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( JavaProxyObject.class, - assemblyQualifiedName, ""); } diff --git a/src/Java.Interop/java/net/dot/jni/internal/JavaProxyThrowable.java b/src/Java.Interop/java/net/dot/jni/internal/JavaProxyThrowable.java index 56abfc00a..066025ac5 100644 --- a/src/Java.Interop/java/net/dot/jni/internal/JavaProxyThrowable.java +++ b/src/Java.Interop/java/net/dot/jni/internal/JavaProxyThrowable.java @@ -8,11 +8,9 @@ extends java.lang.Error implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.Interop.JavaProxyThrowable, Java.Interop"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( JavaProxyThrowable.class, - assemblyQualifiedName, ""); } diff --git a/tests/Java.Base-Tests/Java.Base/JavaVMFixture.cs b/tests/Java.Base-Tests/Java.Base/JavaVMFixture.cs index f1729d6cb..63d9a5ced 100644 --- a/tests/Java.Base-Tests/Java.Base/JavaVMFixture.cs +++ b/tests/Java.Base-Tests/Java.Base/JavaVMFixture.cs @@ -17,6 +17,7 @@ static partial void CreateJavaVM () var c = new TestJVM ( jars: new[]{ "java.base-tests.jar" }, typeMappings: new Dictionary () { + ["example/MyIntConsumer"] = typeof (MyIntConsumer), ["example/MyRunnable"] = typeof (MyRunnable), [JavaInvoker.JniTypeName] = typeof (JavaInvoker), } diff --git a/tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs b/tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs index 2aea0aac7..ba74d62c8 100644 --- a/tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs +++ b/tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs @@ -37,6 +37,9 @@ class JavaVMFixtureTypeManager : JniRuntime.JniTypeManager { [GenericHolder.JniTypeName] = typeof (GenericHolder<>), [RenameClassBase.JniTypeName] = typeof (RenameClassBase), [RenameClassDerived.JniTypeName] = typeof (RenameClassDerived), + [CallVirtualFromConstructorBase.JniTypeName] = typeof (CallVirtualFromConstructorBase), + [CallVirtualFromConstructorDerived.JniTypeName] = typeof (CallVirtualFromConstructorDerived), + [GetThis.JniTypeName] = typeof (GetThis), }; public JavaVMFixtureTypeManager () diff --git a/tests/Java.Interop-Tests/java/net/dot/jni/test/CallVirtualFromConstructorDerived.java b/tests/Java.Interop-Tests/java/net/dot/jni/test/CallVirtualFromConstructorDerived.java index 44bab4560..5ae143daf 100644 --- a/tests/Java.Interop-Tests/java/net/dot/jni/test/CallVirtualFromConstructorDerived.java +++ b/tests/Java.Interop-Tests/java/net/dot/jni/test/CallVirtualFromConstructorDerived.java @@ -8,11 +8,9 @@ public class CallVirtualFromConstructorDerived extends CallVirtualFromConstructorBase implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.InteropTests.CallVirtualFromConstructorDerived, Java.Interop-Tests"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( CallVirtualFromConstructorDerived.class, - assemblyQualifiedName, ""); } @@ -23,8 +21,7 @@ public CallVirtualFromConstructorDerived (int value) { if (CallVirtualFromConstructorDerived.class == getClass ()) { net.dot.jni.ManagedPeer.construct ( this, - assemblyQualifiedName, - "System.Int32", + "(I)V", value ); } diff --git a/tests/Java.Interop-Tests/java/net/dot/jni/test/GetThis.java b/tests/Java.Interop-Tests/java/net/dot/jni/test/GetThis.java index 3013ebb75..f3a27d025 100644 --- a/tests/Java.Interop-Tests/java/net/dot/jni/test/GetThis.java +++ b/tests/Java.Interop-Tests/java/net/dot/jni/test/GetThis.java @@ -6,11 +6,9 @@ public class GetThis implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.InteropTests.GetThis, Java.Interop-Tests"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( GetThis.class, - assemblyQualifiedName, ""); } @@ -20,8 +18,7 @@ public GetThis () { if (GetThis.class == getClass ()) { net.dot.jni.ManagedPeer.construct ( this, - assemblyQualifiedName, - "" + "()V" ); } } diff --git a/tests/Java.Interop-Tests/java/net/dot/jni/test/TestType.java b/tests/Java.Interop-Tests/java/net/dot/jni/test/TestType.java index adf4eebc7..456bef7b5 100644 --- a/tests/Java.Interop-Tests/java/net/dot/jni/test/TestType.java +++ b/tests/Java.Interop-Tests/java/net/dot/jni/test/TestType.java @@ -6,11 +6,9 @@ public class TestType implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.InteropTests.TestType, Java.Interop-Tests"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( TestType.class, - assemblyQualifiedName, ""); } @@ -20,8 +18,7 @@ public TestType () { if (TestType.class == getClass ()) { net.dot.jni.ManagedPeer.construct ( this, - assemblyQualifiedName, - "" + "()V" ); } } @@ -31,8 +28,7 @@ public TestType (TestType a, int b) { if (TestType.class == getClass ()) { net.dot.jni.ManagedPeer.construct ( this, - assemblyQualifiedName, - assemblyQualifiedName + ":System.Int32", + "(Lnet/dot/jni/test/TestType;I)V", a, b ); } diff --git a/tests/Java.Interop.Export-Tests/Java.Interop/ExportTest.cs b/tests/Java.Interop.Export-Tests/Java.Interop/ExportTest.cs index 69c5ca490..9c709a38b 100644 --- a/tests/Java.Interop.Export-Tests/Java.Interop/ExportTest.cs +++ b/tests/Java.Interop.Export-Tests/Java.Interop/ExportTest.cs @@ -30,9 +30,11 @@ long p namespace Java.InteropTests { - [JniTypeSignature ("net/dot/jni/test/ExportType")] + [JniTypeSignature (JniTypeName)] public class ExportTest : JavaObject { + internal const string JniTypeName = "net/dot/jni/test/ExportType"; + [JniAddNativeMethodRegistrationAttribute] static void RegisterNativeMembers (JniNativeMethodRegistrationArguments args) { diff --git a/tests/Java.Interop.Export-Tests/Java.Interop/JavaVMFixture.cs b/tests/Java.Interop.Export-Tests/Java.Interop/JavaVMFixture.cs index 0f252b2b1..c22d6dae1 100644 --- a/tests/Java.Interop.Export-Tests/Java.Interop/JavaVMFixture.cs +++ b/tests/Java.Interop.Export-Tests/Java.Interop/JavaVMFixture.cs @@ -12,7 +12,11 @@ public abstract partial class JavaVMFixture { static JavaVMFixture () { var c = new TestJVM ( - jars: new[]{ "export-test.jar" } + jars: new[]{ "export-test.jar" }, + typeMappings: new() { + [ExportTest.JniTypeName] = typeof (ExportTest), + [JavaCallableExample.TypeSignature] = typeof (JavaCallableExample), + } ); JniRuntime.SetCurrent (c); } diff --git a/tests/Java.Interop.Export-Tests/java/net/dot/jni/test/ExportType.java b/tests/Java.Interop.Export-Tests/java/net/dot/jni/test/ExportType.java index 1d12e7092..28e1f3b55 100644 --- a/tests/Java.Interop.Export-Tests/java/net/dot/jni/test/ExportType.java +++ b/tests/Java.Interop.Export-Tests/java/net/dot/jni/test/ExportType.java @@ -8,11 +8,9 @@ public class ExportType implements GCUserPeerable { - static final String assemblyQualifiedName = "Java.InteropTests.ExportTest, Java.Interop.Export-Tests"; static { net.dot.jni.ManagedPeer.registerNativeMembers ( ExportType.class, - assemblyQualifiedName, ""); } diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs index 0a8702c76..e64033543 100644 --- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs +++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGeneratorTests.cs @@ -641,7 +641,7 @@ extends java.lang.Object __md_methods = ""n_Example:()V:__export__\n"" + """"; - net.dot.jni.ManagedPeer.registerNativeMembers (JavaInteropExample.class, ""Xamarin.Android.ToolsTests.JavaInteropExample, Java.Interop.Tools.JavaCallableWrappers-Tests"", __md_methods); + net.dot.jni.ManagedPeer.registerNativeMembers (JavaInteropExample.class, __md_methods); } @@ -649,7 +649,7 @@ public JavaInteropExample (int p0, int p1) { super (); if (getClass () == JavaInteropExample.class) { - net.dot.jni.ManagedPeer.construct (this, ""Xamarin.Android.ToolsTests.JavaInteropExample, Java.Interop.Tools.JavaCallableWrappers-Tests"", ""System.Int32, System.Private.CoreLib:System.Int32, System.Private.CoreLib"", new java.lang.Object[] { p0, p1 }); + net.dot.jni.ManagedPeer.construct (this, ""(II)V"", new java.lang.Object[] { p0, p1 }); } }