rksoftware

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

Xamarin Android で ARCore Sceneform (プロジェクト作成)

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

その際に長い戦いとなった Android バインド ライブラリ 作成について書いていきます。 今回は、2歩目 - Android アプリプロジェクトを新規作成して一つ目のバインドライブラリを新規作成するところまでです。

目次はこちら ↓

■ 必要なもの

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

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

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

■ Android アプリプロジェクトの作成

まずは、普通に Xamarin Android アプリプロジェクトを作成します。

基本的に好きな用に新規作成すればいいですが、Minimun Android Version は Android 9.0 を選択しておきました。

f:id:rksoftware:20190815193843j:plain

■ Acrivity のコードを書き換える

今回のサンプルアプリはシングル Activity のアプリです。Xamarin.Android プロジェクトでも、MainActivity.cs という名前で Activity が生まれているはずです。この MainActicvity にサンプルアプリの Activity のコードを移植します。Java と C# は構文が近いので、比較的容易に書き換えられます。

比較的容易で書き換えたコードが こちら です。

ただし、正しく C# に書き換えても次のようにクラスや名前空間が見つからないというエラーになります。

f:id:rksoftware:20190815193900j:plain

これは Android のサンプルが追加のライブラリを使っているためです。正しく C# で書き換えても追加のライブラリに依存する部分は当然エラーになってしまいます。そこで、Android バインド ライブラリ です。サンプルで使用しているライブラリをバインドしてしまえば、OK のはずです。

■ 見つからないクラスの居所を探す

正しくは gradle を確認し使われるライブラリをとりあえず一気に全部準備するのが正道でしょうが、今回は一つづつバインドして行ってみます。色々一つずつ問題を起こして確認していきたいので。コードで使用されているクラスなどがどのライブラリの中のものかを確認する際に、Android Studio で手っ取り早く確認することもできます。

f:id:rksoftware:20190815193915j:plain

Android Studio でソースコードを開いて、該当のクラス名を 右クリック > Go To > Declaration で Java クラスのコードが確認できます。そして、ファイル名 (タブ) 部分で、物理ファイルパスを確認できます。このパスをヒントしてライブラリを知ることもできます。

f:id:rksoftware:20190815193932j:plain

■ ライブラリを入手する

Android バインド ライブラリ はネイティブのライブラリをラップするものなので、ネイティブのライブラリの実態ファイルを手にしなければなりません。

軽くネット検索してみると、ローカルマシン内のキャッシュから取り出すように書いてある記事が何件かあったので、gradle のキャッシュから引っ張ってきてみます。キャッシュのパスは先の Android Studio で見たパスから知ることができます。しかし、キャッシュの場所が分かっても安心できません。ここで正しいファイルをきちんと選ばなければなりません。

  • Android Studio で確認した際のパスの .jar ファイル
    このファイルは違います。ただし、パスの一部からライブラリの名前が sceneform-ux であることは分かります。
  • 別の sceneform-ux ディレクトリの中の .jar ファイル
    このファイルも違います。惜しいですが違います。このファイルを組み込むと、バインド ライブラリに欲しい C# のクラスは生まれますが、実行時にエラーになります。

Java.Lang.NoClassDefFoundError: Failed resolution of: Lcom/google/ar/sceneform/ux/R$layout; ---> Java.Lang.ClassNotFoundException: Didn't find class "com.google.ar.sceneform.ux.R$layout"

  • sceneform-ux-1.9.0.aar ファイル
    これです。これを組み込みます。

ちなみに、頑張ってローカルのキャッシュから探すことを書いてきましたが、

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

でダウンロードできます。多分こちらが正道...。

■ Android バインド ライブラリ を新規作成する

sceneform-ux 用の Android バインド ライブラリ を新規作成します。

プロジェクトの新規作成で、プロジェクト テンプレート から Android バインド ライブラリ を選択して新規作成します。

f:id:rksoftware:20190815210808j:plain

■ Android バインドライブラリに .aar を組み込む

作成されたプロジェクトの Jars フォルダに sceneform-ux-1.9.0.aar ファイルを追加します。
追加した sceneform-ux-1.9.0.aar ファイルのプロパティのビルドアクションの項目で LibraryProjectZip を選びます。

■ ビルド

ここでビルドを行う Android バインド プロジェクトのビルドがエラーで失敗します。

f:id:rksoftware:20190815212113j:plain

次回で、このエラーと戦い始めます。

(つづく)