rksoftware

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

Xamarin.Android で ARCore Sceneform (基本)

先日、Android のサンプルコードを Xamarin.Android に書き換えてみた記事を書きました。

その際に長い戦いとなった Android バインド ライブラリ 作成について書いていきます。 今回は、3歩目 - バインドライブラリのビルドエラーを解消するところまでです。

目次はこちら ↓

■ 必要なもの

今回の手順に必要なものは、

  • Android Studio
  • Xamarin の開発環境(この記事では Windows 環境でやってます)

です。Android Studio は書き換える前の Android 用コードの確認に使います。

■ 前回のおさらい

前回の記事です。

Android バインド ライブラリプロジェクトでビルドエラーになっていました。

f:id:rksoftware:20190815212113j:plain

■ エラー発生しているソースコードの確認

エラーとなっているのは C# のソースコードです。これは自動生成されたコードで、Visual Studio のエラー一覧でダブルクリックすれば開く(こともあります)。

f:id:rksoftware:20190818132525j:plain

開かない場合は .cs ファイルは \obj\Debug\generated\src にいるので直接開いて確認しました。

■ エラーの確認

今回については実は、C# ソースコードの確認は必要ありません。エラー一覧のメッセージと発生しているクラスから対処ができます。

エラー CS0534 'DragGesture' は継承抽象メンバー 'BaseGesture.RawSelf.get' を実装しません。

エラー CS0534 'PinchGesture' は継承抽象メンバー 'BaseGesture.RawSelf.get' を実装しません。

エラー CS0534 'TwistGesture' は継承抽象メンバー 'BaseGesture.RawSelf.get' を実装しません。

エラーの発生しているクラスは、Android アプリプロジェクトの MainActivity.cs で使用していないクラスです。なので、消してしまうことで対処が可能です。生成される C# ソースコードの調整は、前回も触れましたが Transforms\Metadata.xml で行います。
ここにどう書けばいいかは、次のページを参照。

そのほか、生まれるものの定義が \obj\Debug\api.xml に作られるのでこちらも参考になります。

<api>
  <package name="com.google.ar.sceneform.ux" jni-name="com/google/ar/sceneform/ux">
    <class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="BaseArFragment.2" static="false" visibility="" jni-signature="Lcom/google/ar/sceneform/ux/BaseArFragment$2;">
      <implements name="android.content.DialogInterface.OnDismissListener" name-generic-aware="android.content.DialogInterface.OnDismissListener" jni-type="Landroid/content/DialogInterface$OnDismissListener;">
      </implements>
      <method abstract="false" deprecated="not deprecated" final="false" name="onDismiss" jni-signature="(Landroid/content/DialogInterface;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
        <parameter name="arg0" type="android.content.DialogInterface" jni-type="Landroid/content/DialogInterface;">
        </parameter>
      </method>
    </class>

今回は、クラスを消してしまえば良いので Transforms\Metadata.xml は次のようにしました。

<metadata>
  <remove-node path="/api/package[@name='com.google.ar.sceneform.ux']/class[@name='DragGesture']" />
  <remove-node path="/api/package[@name='com.google.ar.sceneform.ux']/class[@name='TwistGesture']" />
  <remove-node path="/api/package[@name='com.google.ar.sceneform.ux']/class[@name='PinchGesture']" />
</metadata>

今回の様にとりあえず消してしまうのが一番手っ取り早く間違いがないです。
(実際には、消せない部分がエラーになって苦しみます)

これで、一旦エラーが消えるはずです。

はずです。(大抵消えません)

消えないときはプロジェクトを一度アンロードしてから再読み込みします。

■ 必要なクラスが生まれていない

Android バインド ライブラリプロジェクトのエラーは消えました。
ここで Android アプリのプロジェクトにプロジェクトに戻ってみると、欲しかったクラスが生成されていません(今回欲しかったクラスは com.google.ar.sceneform.ux.ArFragment)。Android Studio で確認してみると継承の根っこに android.support.v4.app.Fragment クラス、com.google.ar.sceneform.Scene がいます。

これらのクラスを手に入れるために、

  • android.support.v4.app.Fragment は NuGet Xamarin.Android.Support.Fragment を追加
  • com.google.ar.sceneform.Scene は、com/google/ar/sceneform/core/1.9.0/core-1.9.0.aar でもう一つ Android 場隠語ライブラリプロジェクトを作成

します。
core-1.9.0.aar は次からダウンロードしました。

https://dl.google.com/dl/android/maven2/com/google/ar/sceneform/core/1.9.0/core-1.9.0.aar

■ Android バインド ライブラリプロジェクトをもう一個作る

作り方は、最初の一つと同様です。プロジェクトを作ったら、これまで触ってきた Android バインド ライブラリプロジェクトから参照します。

f:id:rksoftware:20190818132805j:plain

参照を追加したらビルドを実行し、ライブラリプロジェクトをアンロード → 再読み込みします。
これで欲しかった Com.Google.AR.Sceneform.UX .ArFragment クラスが手にはいります。

**MainActivity.cs``` に名前空間の usig を追加します。

おめでとうございます! ありがとうございます!
無事、クラスが生まれてエラーが消えました。

後は基本的にこの繰り返しです。必要な Android バインド ライブラリを作って、\obj\Debug\generated\src のファイルを確認しながら Transforms\Metadata.xml を編集してを繰り返します。それで頑張ればゴールにたどり着きます。

f:id:rksoftware:20190811160427j:plain

概要は以上です。
ただし、この後でも様々な乗り越える壁があるので、続きも書いて行こうと思います。

(つづく)