2012-05-08 6 views
2

私はikvm-monotouchとMonoTouchでJavaゲームを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

ライン#1841 TypeWrapper.csからは、次のとおりです。

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

ので、それはどちらかに関連します:

A) MakeGenericTypeという意味では、AOTコンパイラは、でをコンパイル時に知りません。つまり、creatする必要があります。 e a ClassLiteral<Cloneable>。それがわからないので、それはExecutionEngineExceptionにつながる必要なコードをコンパイルしません。

これを回避するには、ヒントコードが必要です。例えば。あなたのコードのどこかで、でなく、をリンクしたり、最適化したりしてください。 (管理という意味で

new ClassLiteral<Cloneable>(); 

B)GetField("Value"))リンカは、このフィールドを削除した可能性があります。しかし、NullReferenceException(と.cctorの内部ではありません)で失敗しているはずです。ではないは、それがリンカの問題だと信じています。

OTOHプロジェクトでリンカを無効にしてデバイスを再構築して実行すると、この可能性を排除することが非常に高速で簡単に簡単です(リンカの問題が発生した場合は[Preserve]を使用して回避することができます)。属性をValueフィールドに入力してください(後でリンカーを再度有効にしてください)。

+0

まだテストする機会はありませんでしたが、それが問題になるかどうかわかりませんその属性を適用してください(これは、C#を使ったときには私の経験がありません)。ClassLiteralは、ランタイムで定義された動的な型のようです(https://github.com/samskivert/ikvm-monotouch/blob/master/runtime/ RuntimeHelperTypes.cs#L89)そのフィールドに属性を適用することは可能ですか?印象を受け取ります[Preserv e]はコンパイラフラグですか? – roguenet

+0

IKVMは、コード生成を許可しないiOS上で動作することはないため、実行時ではなくコンパイル時にこれを実行しなければなりません。とにかく言及した理由から(b)とは思っていませんが、リンクしないで試してみると属性を追加する必要はありません。 – poupou

+0

(b)が原因ではありません。残念ながら、ClassLiteralはJavaで利用できないため、(a)私のプロジェクトの一部に示唆されているヒントを作ることができません。私たちのアプリ用にikvm-monotouchプロジェクトをカスタマイズする必要はありません。私たちはおそらく、このような反射の使用を最終的には他の理由で取り除く必要があるでしょうが、私は今この問題を回避するつもりです。 – roguenet