2

我正在通过ikvm-monotouch和 MonoTouch 将 Java 游戏移植到 iOS。我遇到了一个让我有点头疼的错误,虽然我不确定这是否是 MonoTouch 中的实际错误,所以我在点击错误数据库之前在这里询问。

在反映对象字段的方法期间,我收到下面的 JIT 编译错误。我(到目前为止)只在反映实现的对象时看到此错误Cloneable,尽管我不确定这是否是触发此错误的具体原因。

Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for ikvm.internal.ClassLiteral`1 ---> System.ExecutionEngineException: Attempting to JIT compile method 'ikvm.internal.ClassLiteral`1<java.lang.Cloneable>:.cctor ()' while running with --aot-only.
   --- End of inner exception stack trace ---
   at System.Reflection.MonoField.GetValue (System.Object obj) [0x0006a] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoField.cs:124 
   at IKVM.Internal.TypeWrapper.LazyInitClass () [0x00063] in /Users/nathan/projects/ikvm-monotouch-git/runtime/TypeWrapper.cs:1841 
   at IKVM.Internal.TypeWrapper.get_ClassObject () [0x00027] in /Users/nathan/projects/ikvm-monotouch-git/runtime/TypeWrapper.cs:1756 
   at IKVM.NativeCode.java.lang.Class.getInterfaces (java.lang.Class thisClass) [0x0001c] in /Users/nathan/projects/ikvm-monotouch-git/runtime/openjdk.cs:2556 
   at java.lang.Class.getInterfaces () [0x00000] in <filename unknown>:0 
   at java.lang.Class.privateGetPublicFields (Set ) [0x00000] in <filename unknown>:0 
   at java.lang.Class.privateGetPublicFields (Set ) [0x00000] in <filename unknown>:0 
   at java.lang.Class.getFields (ikvm.internal.CallerID ) [0x00000] in <filename unknown>:0 

ikvm-monotouch TypeWrapper 类的快速链接:https ://github.com/samskivert/ikvm-monotouch/blob/master/runtime/TypeWrapper.cs

4

1 回答 1

1

TypeWrapper.cs 中的第 1841 行是:

clazz = (java.lang.Class)typeof(ikvm.@internal.ClassLiteral<>).
    MakeGenericType(type).GetField("Value").GetValue(null);

所以它要么与:

a)从某种意义上说,AOT 编译器在编译时MakeGenericType不知道它需要创建一个. 由于它不知道,因此它不会编译导致.ClassLiteral<Cloneable>ExecutionEngineException

您可以通过提示AOT 编译器需要该代码来解决此问题。例如,在您的代码中添加一个不会被链接或优化的地方。

new ClassLiteral<Cloneable> ();

b)GetField("Value")从某种意义上说(托管)链接器可能已删除该字段。但是它应该失败了NullReferenceException(而不是在.cctor内)所以我相信这是一个链接器问题。

OTOH,通过禁用项目中的链接器,在设备上重建和执行(如果它开始工作,那么这是一个链接器问题,您将能够通过使用字段[Preserve]上的属性来解决此问题Value(并在之后重新启用链接器)。

于 2012-05-08T23:22:45.437 回答