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
아직 테스트 할 기회가 없었지만 (b) 아직 문제가되지 않으면 어떻게해야 할 지 모르겠습니다. (이 부분적으로 C#을 통해 빛나는 내 경험이 있습니다.) ClassLiteral 일종의 런타임 정의 동적 유형을 나타납니다 (https://github.com/samskivert/ikvm-monotouch/blob/master/runtime/ RuntimeHelperTypes.cs # L89) 그 필드에 속성을 적용 할 수 있습니까? e]는 컴파일러 플래그입니까? – roguenet
IKVM은 코드 생성을 허용하지 않는 iOS에서는 작동하지 않으므로 런타임이 아닌 컴파일 타임에이 작업을 수행해야합니다. 어쨌든 언급 된 이유 때문에 (b)라고 생각하지 않습니다. 그러나 링크하지 않고 시도하면 속성을 추가 할 필요없이이를 확인합니다. – poupou
(b)가 원인이 아닙니다. 안타깝게도 ClassLiteral은 Java에서 사용할 수 없기 때문에 (a) 내 프로젝트에서 제안한 힌트를 만들 수 없으며 우리 앱 전용으로 ikvm-monotouch 프로젝트를 사용자 정의하고 싶지 않습니다. 우리는 아마도 어쨌든 결국 다른 이유로이 반사 사용을 제거해야 할 것입니다. 그래서 지금 당장이 문제를 해결할 것입니다. – roguenet