先日、Android のサンプルコードを Xamarin.Android に書き換えてみた記事を書きました。
その際に長い戦いとなった Android バインド ライブラリ 作成について書いていきます。 今回は、6歩目 - エラーに順に対応していく更に続きです。
目次はこちら ↓
■ 前回のおさらい
前回の記事です。
少しづつエラーを解消して行っています。
■ エラー CS0234 型または名前空間の名前 'Rendering' が名前空間 'Com.Google.AR.Sceneform' に存在しません (アセンブリ参照があることを確認してください)
これは単純にライブラリの参照設定が不足しています。
https://dl.google.com/dl/android/maven2/com/google/ar/sceneform/ux/sceneform-ux/1.9.0/sceneform-ux-1.9.0.aar
のプロジェクトから
https://dl.google.com/dl/android/maven2/com/google/ar/sceneform/rendering/1.9.0/rendering-1.9.0.aar
のプロジェクトを参照します。
■ エラー java/lang/String;Ljava/util/concurrent/CompletableFuture;Ljava/lang/String;)Ljava/util/concurrent/CompletableFuture; : invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)
■ エラー com.android.dx.cf.code.SimException: ERROR in com.google.ar.sceneform.rendering.CameraStream.:(ILcom/google/ar/sceneform/rendering/Renderer;)V: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)
Android アプリ プロジェクトのプロパティで Android オプション の Dex コンパイラ で d8 を選択。
ビルドエラーがなくなりました
おめでとうございます! ありがとうございます! ここでビルドエラーがなくなりました!
満を持して実行すると、なんと! 実行時エラーです。
■ Unhandled Exception: Android.Views.InflateException: が発生しました
SetContentView(Resource.Layout.activity_main);
でエラーが発生します。エラーを深堀してみると
{Android.Views.InflateException: Binary XML file line #15: Binary XML file line #15: Binary XML file line #15: Error inflating class com.google.ar.sceneform.ArSceneView ---> Android.Views.InflateException: Binary XML file line #15: Binary XML file line #15: Error inflating class com.google.ar.sceneform.ArSceneView ---> Android.Views.InflateException: Binary XML file line #15: Error inflating class com.google.ar.sceneform.ArSceneView ---> Java.Lang.Reflect.InvocationTargetException: Exception of type 'Java.Lang.Reflect.InvocationTargetException' was thrown. ---> Java.Lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/filament/android/UiHelper$RendererCallback; ---> Java.Lang.ClassNotFoundException: Didn't find class "com.google.android.filament.android.UiHelper$RendererCallback"
根っこは
Java.Lang.ClassNotFoundException: Didn't find class "com.google.android.filament.android.UiHelper$RendererCallback"
です。
見つからないクラスの含まれるライブラリで バインド ライブラリ を作って Android アプリ プロジェクトから参照します。
https://dl.google.com/dl/android/maven2/com/google/ar/sceneform/filament-android/1.9.0/filament-android-1.9.0.aar
そして、実行。今度こそ、、、実行時エラー!
Unhandled Exception: Java.Lang.NoSuchMethodError: <Timeout exceeded getting exception details>
■ Unhandled Exception: Java.Lang.NoSuchMethodError:
このエラーはいくつかのパターンで出ますが、今回はライブラリのバージョンの不整合でした。
今回の手順では各 .aar ファイルのバージョンが 1.9.0でした。バインド ライブラリの作成で試行錯誤している間にライブラリがバージョンアップしていて、NuGet パッケージ Xamarin.Google.ARCore も最新が 1.11.0 になっていました。
今回は Xamarin.Google.ARCore も 1.9.0 にしました。
■ 実行
これでようやく ARCore で遊ぶことができました。