Skip to content

Commit e38e3b7

Browse files
committed
Parse Mono.Android.dll FIRST for typemaps
The remaining unit test failures are because `java/lang/Object` is bound as `Java.InteropTests.JavaLangRemappingTestObject, Java.Interop-Tests`, NOT `Java.Lang.Object, Mono.Android`. `Android.RuntimeTests.XmlReaderPullParserTest.ToLocalJniHandle()`: System.NotSupportedException : Unable to activate instance of type Java.InteropTests.JavaLangRemappingTestObject from native handle 0x19 (key_handle 0x2408476). ----> System.MissingMethodException : No constructor found for Java.InteropTests.JavaLangRemappingTestObject::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ----> Java.Interop.JavaLocationException : Exception_WasThrown, Java.Interop.JavaLocationException at Java.Interop.TypeManager.CreateInstance(IntPtr , JniHandleOwnership , Type ) at Java.Interop.TypeManager.CreateInstance(IntPtr , JniHandleOwnership ) at Android.Runtime.XmlResourceParserReader.FromNative(IntPtr , JniHandleOwnership ) at Android.Runtime.XmlResourceParserReader.FromJniHandle(IntPtr handle, JniHandleOwnership transfer) at Android.Content.Res.Resources.GetXml(Int32 ) at Android.RuntimeTests.XmlReaderPullParserTest.ToLocalJniHandle() at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object , BindingFlags ) --MissingMethodException at Java.Interop.TypeManager.CreateProxy(Type , IntPtr , JniHandleOwnership ) at Java.Interop.TypeManager.CreateInstance(IntPtr , JniHandleOwnership , Type ) --JavaLocationException Java.Lang.Error: Exception_WasThrown, Java.Lang.Error --- End of managed Java.Lang.Error stack trace --- java.lang.Error: Java callstack: at crc643df67da7b13bb6b1.TestInstrumentation_1.n_onStart(Native Method) at crc643df67da7b13bb6b1.TestInstrumentation_1.onStart(TestInstrumentation_1.java:35) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189) --- End of managed Java.Lang.Error stack trace --- java.lang.Error: Java callstack: at crc643df67da7b13bb6b1.TestInstrumentation_1.n_onStart(Native Method) at crc643df67da7b13bb6b1.TestInstrumentation_1.onStart(TestInstrumentation_1.java:35) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189) `Java.InteropTests.JniRuntimeJniValueManagerTests.CreateValue()`: System.NotSupportedException : Unable to activate instance of type Java.InteropTests.JavaLangRemappingTestObject from native handle 0x3432 (key_handle 0x9d3f1d1). ----> System.MissingMethodException : No constructor found for Java.InteropTests.JavaLangRemappingTestObject::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ----> Java.Interop.JavaLocationException : Exception_WasThrown, Java.Interop.JavaLocationException at Java.Interop.TypeManager.CreateInstance(IntPtr , JniHandleOwnership , Type ) at Android.Runtime.AndroidValueManager.CreatePeer(JniObjectReference& , JniObjectReferenceOptions , Type ) at Java.Interop.JavaPeerableValueMarshaler.CreateGenericValue(JniObjectReference& , JniObjectReferenceOptions , Type ) at Java.Interop.JniValueMarshaler`1[[Java.Interop.IJavaPeerable, Java.Interop, Version=7.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065]].CreateValue(JniObjectReference& , JniObjectReferenceOptions , Type ) at Java.Interop.JniRuntime.JniValueManager.CreateValue(JniObjectReference& , JniObjectReferenceOptions , Type ) at Java.InteropTests.JniRuntimeJniValueManagerTests.CreateValue() at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args) at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object , BindingFlags ) --MissingMethodException at Java.Interop.TypeManager.CreateProxy(Type , IntPtr , JniHandleOwnership ) at Java.Interop.TypeManager.CreateInstance(IntPtr , JniHandleOwnership , Type ) --JavaLocationException Java.Lang.Error: Exception_WasThrown, Java.Lang.Error --- End of managed Java.Lang.Error stack trace --- java.lang.Error: Java callstack: at crc643df67da7b13bb6b1.TestInstrumentation_1.n_onStart(Native Method) at crc643df67da7b13bb6b1.TestInstrumentation_1.onStart(TestInstrumentation_1.java:35) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189) --- End of managed Java.Lang.Error stack trace --- java.lang.Error: Java callstack: at crc643df67da7b13bb6b1.TestInstrumentation_1.n_onStart(Native Method) at crc643df67da7b13bb6b1.TestInstrumentation_1.onStart(TestInstrumentation_1.java:35) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189) etc., etc. (*Actually*, part of the problem is that `AndroidRuntime` doesn't support Java.Interop-style activation constructors *at all*… …and I don't want to deal with that right now, either.) It was borderline bananas to expect anything to work when `java/lang/Object` *wasn't* bound as `Java.Lang.Object, Mono.Android`. I'm frankly suprised there are *only* 23 failures, most of them duplicates of the same 8 failures, two of which are above. Update `<GenerateJavaStubs/>` and related typemap code to special-case `Mono.Android.dll` so that it is processed *first*. This *should* ensure that `Java.Lang.Object` is *preferred* over any other possible binding of `java/lang/Object`.
1 parent 1d80b8c commit e38e3b7

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/Xamarin.Android.Build.Tasks/Tasks/GenerateJavaStubs.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ void Run (XAAssemblyResolver res, bool useMarshalMethods)
213213
var scanner = new XAJavaTypeScanner (Log, cache) {
214214
ErrorOnCustomJavaObject = ErrorOnCustomJavaObject,
215215
};
216-
List<JavaType> allJavaTypes = scanner.GetJavaTypes (allTypemapAssemblies.Values, res);
216+
List<JavaType> allJavaTypes = scanner.GetJavaTypes (GetAllTypemapAssemblies (allTypemapAssemblies.Values), res);
217217
var javaTypes = new List<JavaType> ();
218218

219219
foreach (JavaType jt in allJavaTypes) {
@@ -422,6 +422,19 @@ void MaybeAddAbiSpecifcAssembly (ITaskItem assembly, string fileName)
422422
}
423423
}
424424

425+
static ICollection<ITaskItem> GetAllTypemapAssemblies (ICollection<ITaskItem> assemblies)
426+
{
427+
// We need `Mono.Android.dll` to be *first*, so that in `acw-map.txt` the
428+
// entry for `java/lang/Object` always resolves to `Java.Lang.Object, Mono.Android`.
429+
var c = new List<ITaskItem>(assemblies);
430+
var e = c.Find (item => string.Compare ("Mono.Android.dll", Path.GetFileName (item.ItemSpec), StringComparison.OrdinalIgnoreCase) == 0);
431+
if (e != null) {
432+
c.Remove (e);
433+
c.Insert (0, e);
434+
}
435+
return c;
436+
}
437+
425438
AssemblyDefinition LoadAssembly (string path, XAAssemblyResolver? resolver = null)
426439
{
427440
string pdbPath = Path.ChangeExtension (path, ".pdb");

0 commit comments

Comments
 (0)