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 コンパイラーに示唆することで、これを回避できる場合があります。たとえば、リンクされたり最適化されたりしないコードのどこかに a を追加します。

new ClassLiteral<Cloneable> ();

b) GetField("Value")(マネージド) リンカーがこのフィールドを削除できたという意味で。NullReferenceExceptionただし、 (.cctor内ではなく)で失敗するはずだったので、リンカーの問題ではないと思います。

OTOH プロジェクトでリンカーを無効にし、再構築してデバイス上で実行することにより、この可能性を非常に迅速かつ簡単に排除できます (機能し始めた場合、それはリンカーの問題です。フィールドの[Preserve]属性を使用することで、これを回避できValueます (その後、リンカーを再度有効にします)。

于 2012-05-08T23:22:45.437 に答える