首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoTouch + IKVM项目中的即时编译问题

MonoTouch + IKVM项目中的即时编译问题
EN

Stack Overflow用户
提问于 2012-05-09 06:37:11
回答 1查看 676关注 0票数 2

我正在通过ikvm-monotouch和MonoTouch将一款Java游戏移植到iOS。我遇到了一个令人费解的错误,尽管我不确定它是否是MonoTouch中的一个真正的bug,所以我在访问bug数据库之前在这里询问。

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-09 07:22:45

来自TypeWrapper.cs的第1841行是:

代码语言:javascript
复制
clazz = (java.lang.Class)typeof(ikvm.@internal.ClassLiteral<>).
    MakeGenericType(type).GetField("Value").GetValue(null);

因此,它要么与以下因素相关:

a) MakeGenericType,即AOT编译器在编译时间时不知道它需要创建ClassLiteral<Cloneable>。因为它不知道,所以它不会编译导致ExecutionEngineException的所需代码。

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

代码语言:javascript
复制
new ClassLiteral<Cloneable> ();

b) (受管理的)链接器可以移除该字段的意义上的GetField("Value")。然而,它应该会因为NullReferenceException (而不是在.cctor内部)而失败,所以我不而不是,我认为这是一个链接器问题。

通过在你的项目中禁用链接器,在设备上重新构建和执行,可以非常快速和容易地消除这种可能性(如果它开始工作,那么这是一个链接器问题。您可以通过在Value字段上使用[Preserve]属性来解决这个问题(然后重新启用链接器)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10507549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档