rksoftware

Visual Studio とか C# とかが好きです

Xamarin.Android で ARCore Sceneform (2つ目以降のエラーを順に対応 その3)

先日、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 で遊ぶことができました。
f:id:rksoftware:20190811160427j:plain