私は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
まだテストする機会はありませんでしたが、それが問題になるかどうかわかりませんその属性を適用してください(これは、C#を使ったときには私の経験がありません)。ClassLiteralは、ランタイムで定義された動的な型のようです(https://github.com/samskivert/ikvm-monotouch/blob/master/runtime/ RuntimeHelperTypes.cs#L89)そのフィールドに属性を適用することは可能ですか?印象を受け取ります[Preserv e]はコンパイラフラグですか? – roguenet
IKVMは、コード生成を許可しないiOS上で動作することはないため、実行時ではなくコンパイル時にこれを実行しなければなりません。とにかく言及した理由から(b)とは思っていませんが、リンクしないで試してみると属性を追加する必要はありません。 – poupou
(b)が原因ではありません。残念ながら、ClassLiteralはJavaで利用できないため、(a)私のプロジェクトの一部に示唆されているヒントを作ることができません。私たちのアプリ用にikvm-monotouchプロジェクトをカスタマイズする必要はありません。私たちはおそらく、このような反射の使用を最終的には他の理由で取り除く必要があるでしょうが、私は今この問題を回避するつもりです。 – roguenet