gpt4 book ai didi

java - MonoTouch + IKVM 项目中的 JIT 编译问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:34 25 4
gpt4 key购买 nike

我正在通过 ikvm-monotouch 将 Java 游戏移植到 iOS和单点触控。我遇到了一个有点难以理解的错误,虽然我不确定它是否是 MonoTouch 中的一个实际错误,所以我在访问错误数据库之前先在这里询问。

在一个反射(reflect)对象字段的方法中,我遇到了下面的 JIT 编译错误。我(到目前为止)只在反射(reflection)实现 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

最佳答案

TypeWrapper.cs 中的第 1841 行是:

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

所以它要么与:

a) MakeGenericType 在 AOT 编译器不知道的意义上,在编译时,它需要创建一个 ClassLiteral<Cloneable> 。由于它不知道,因此不会编译导致 ExecutionEngineException 的所需代码。

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

new ClassLiteral<Cloneable> ();

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

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

关于java - MonoTouch + IKVM 项目中的 JIT 编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com