2012-05-08 3 views
2

Java 게임을 ikvm-monotouch 및 MonoTouch를 통해 iOS로 포팅했습니다. MonoTouch의 실제 버그인지 확신 할 수는 없지만 오류가 발생했습니다. 버그 데이터베이스를 치기 전에 여기에서 묻습니다.MonoTouch + IKVM 프로젝트에서 JIT 컴파일 문제가 발생했습니다.

개체 필드에 반영되는 방법 중에 아래의 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

답변

1

라인 TypeWrapper.cs에서 # 1841는 다음과 같습니다

clazz = (java.lang.Class)typeof([email protected]<>). 
    MakeGenericType(type).GetField("Value").GetValue(null); 

그래서 그것의 하나에 관련된 :

A) 컴파일러가 일 때 을 알지 못한다는 의미에서 MakeGenericType은 creat해야한다는 의미에서 e a ClassLiteral<Cloneable>. 그것이 모르기 때문에, 그것은 ExecutionEngineException에 이르는 필수 코드를 컴파일하지 않습니다.

힌트 AOT 컴파일러가 코드를 필요로 할 수 있습니다. 예 : 코드에 이 아닌이 링크되거나 최적화되도록 추가하십시오. (가) (관리한다는 점에서

new ClassLiteral<Cloneable>(); 

b) GetField("Value")) 링커는이 필드를 제거 할 수 있었다. 그러나 그것은 NullReferenceException (와 .cctor 안)에서 실패해야합니다. 아니요.은 링커 문제라고 생각합니다.

OTOH 프로젝트에서 링커를 사용 중지하고 장치를 다시 실행하여 실행하면이 가능성을 매우 빠르고 쉽게 제거 할 수 있습니다 (작동이 시작되면 링커 문제 일 수 있습니다.) [Preserve]을 사용하여이 문제를 해결할 수 있습니다. 속성을 Value 필드에 입력하고 (나중에 링커를 다시 사용하십시오.)

+0

아직 테스트 할 기회가 없었지만 (b) 아직 문제가되지 않으면 어떻게해야 할 지 모르겠습니다. (이 부분적으로 C#을 통해 빛나는 내 경험이 있습니다.) ClassLiteral 일종의 런타임 정의 동적 유형을 나타납니다 (https://github.com/samskivert/ikvm-monotouch/blob/master/runtime/ RuntimeHelperTypes.cs # L89) 그 필드에 속성을 적용 할 수 있습니까? e]는 컴파일러 플래그입니까? – roguenet

+0

IKVM은 코드 생성을 허용하지 않는 iOS에서는 작동하지 않으므로 런타임이 아닌 컴파일 타임에이 작업을 수행해야합니다. 어쨌든 언급 된 이유 때문에 (b)라고 생각하지 않습니다. 그러나 링크하지 않고 시도하면 속성을 추가 할 필요없이이를 확인합니다. – poupou

+0

(b)가 원인이 아닙니다. 안타깝게도 ClassLiteral은 Java에서 사용할 수 없기 때문에 (a) 내 프로젝트에서 제안한 힌트를 만들 수 없으며 우리 앱 전용으로 ikvm-monotouch 프로젝트를 사용자 정의하고 싶지 않습니다. 우리는 아마도 어쨌든 결국 다른 이유로이 반사 사용을 제거해야 할 것입니다. 그래서 지금 당장이 문제를 해결할 것입니다. – roguenet