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

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

(つづく)

秋葉原 C# もくもく会 #96 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #96 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20190815193151j:plain

■ 今週の成果発表

今週も、足元固めの日でした。もくもく会の本来の進捗ですね。

  • いつものブログ書きでした
  • Xamarin.Forms の HotReload を試して遊んでました
  • Unity のプラグイン作りに苦戦しています

ちなみにこの勉強会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2019/08/22 に開催予定です。

C# に関心のある方、是非遊びに来てください。

Visual Studio の 16.2.2 がリリースされました

Visual Studio のアップデート 16.2.2 がリリースされました。
今回は日本語の自動翻訳も概ね分かる感じですが見てみましょう。

■ 更新内容

問題の解決

  • VS2019 16.2.0 (問題報告時のバージョン) でテストエクスプローラにテストが表示されない問題が対策されました
  • シャットダウンの最中に Visual Studio が応答を停止する問題が対策されました

脆弱性対策

1件の脆弱性対策が含まれています。

脆弱性の対策もあるし、今晩にもアップデートしましょう。

■ 更新方法

Visual Studio の更新はメニューの ツール > ツールと機能を取得 で開くインストーラーから行えます。

Android バインド ライブラリ を作る (複数の .jar )

以前に、Android バインド ライブリ (Xamarin) を作る記事を書きました。

この中で、バインドする .jar を Jars ディレクトリに置きました。

■ 末尾が s

そう、ディレクトリの末尾が s つまり複数形です。実際試してみても複数の .jar を置くことができました。

■ 実際に複数置いてビルドしてみた

画像の様になりました。

f:id:rksoftware:20190812173741j:plain

ちょっと命名が分かりにくいですが、

ファイル名 含まれるパッケージ
javaclasses.jar com.example.sampleclasses
javaclasses2.jar com.example.sampleclasses2
myaarlibrary1.aar com.example.myaarlibrary1
myaarlibrary2.aar com.example.myaarlibrary2

となっています。

■ .jar 達、.aar 達

Jars ディレクトリの2つの .jar がバインドできているのが分かります。
もう2ファイル、今回は .aar というファイルも追加しています。こちらは、一方しかできていません。

設定次第なのかもしれませんが、今のところ1ファイル1プロジェクトで進めて何とか私は動かしています。

■ .aar

.aar について詳しくはこちら。

Android 用のライブラリで、Java クラスだけでなくリソースファイルも含められます。

2019/08/14 追記

この複数の一つの .dll に複数の .jar を入れる方法は検証や自分がちょっと使うだけなら手軽ですが、ちゃんと再利用等考える避けたほうが良いと教えていただきまし た。

埋め込みのスライドが1ページ目になってしまうのでスライドのページへの直接のリンクを。16ページ目~参照ください。
https://speakerdeck.com/atsushieno/java-binding-tips-and-tricks-2017?slide=16

Android バインド ライブラリ を作る

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

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

目次はこちら ↓

■ 必要なもの

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

  • Java の開発環境または、手ごろな .jar ファイル
  • Xamarin の開発環境(この記事では Windows 環境でやってます)

です。

■ 事前準備 - .jar ファイルを作る

まず作ってみるということで要素を最小限にするためにシンプルな1メソッドの1クラスの .jar を作りました。

package com.example.sampleclasses;

public class JavaClass {
    public String getText(){ return "風が語りかけます."; }
}

.jar ファイル名は javaclasses.jar としています。

■ プロジェクト新規作成

Android バインド ライブラリ を新規作成します。
Visual Studio のプロジェクトの新規作成で、テンプレートから Android バインド ライブリ (Xamarin) を選択します。プロジェクト タイプ がライブラリでなく、モバイルである点に気を付けてください。

f:id:rksoftware:20190812162327j:plain

今回は、プロジェクト名を MyBindLibrary としてみました。

f:id:rksoftware:20190812162349j:plain

■ .jar ファイルをプロジェクトに追加

プロジェクト内のフォルダ Jars の中に .jar ファイルを追加します。

f:id:rksoftware:20190812162414j:plain

.jar ファイルを追加したら、ファイルのプロパティでビルドアクションを EmbeddedJar に変更します。
デフォルトの InputJar のままだと、実行時に Java.Lang.ClassNotFoundException が発生します。

f:id:rksoftware:20190812162426j:plain

ビルドすると、 .dll が出来上がりますが、何もしてないのに (Java コードも何もしていないレベルのシンプルなものなのに) 警告が出ます。
警告は、生成された .cs ファイルのコードの話なので内容をコードで確認できます。何もしてなくても警告がでますし今後も大量の警告がでるので、警告は無視して進めます。

f:id:rksoftware:20190812162531j:plain

■ Android アプリ プロジェクトを新規作成、バインド ライブラリを参照する

ソリューション内に、Android アプリ プロジェクトを新規作成し、作成きた MyBindLibrary バインド ライブラリ プロジェクトを参照します。
ここは、別ソリューションで .dll 参照にしても良いですが、この方が楽だと思います(※1点だけ後述の注意点があります)。

f:id:rksoftware:20190812162515j:plain

バインド ライブラリ 内のメンバーを使用する

今回は Java で com.example.sampleclasses.JavaClass クラスを作ったのでバインディング ライブラリには C# 的な命名の Com.Example.Sampleclasses.JavaClass クラスが作られています。また、getText メソッドも C# 的に Text プロパティになっています。
この Com.Example.Sampleclasses.JavaClass クラスの Text プロパティの値を画面表示するコードを書きます。

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    SetContentView(Resource.Layout.activity_main);

    var textView = FindViewById<TextView>(Resource.Id.textView);
    textView.Text = new Com.Example.Sampleclasses.JavaClass().Text;

このプロパティの値は "風が語りかけます." でした。

package com.example.sampleclasses;

public class JavaClass {
    public String getText(){ return "風が語りかけます."; }
}

■ 実行

実行すると、見事 風が語りかけます. と表示され、独自の .jar ファイルが Xamarin.Android で使えました!

■ 注意点 - 居るはずの .dll 内のメンバーが見えない

バインド ライブリ にどんなメンバーが含まれているかは、バインド ライブリ プロジェクトの \obj\Debug\generated\src\ ディレクトリ内の .cs ファイル群で確認できます。また、.dll に含まれているメンバーは、オブジェクト ブラウザで確認できます (メニューの 表示 > オブジェクト ブラウザー)。
これらを確認し、\obj\Debug\generated\src\ ディレクトリ内の .cs ファイル群に目的のメンバーがいるのにオブジェクト ブラウザやコンバイラ上は居ないことになっている場合は次の手順で正しくなります。

  • 該当の バインド ライブリ プロジェクト を一旦アンロード

\obj\Debug\generated\src\ ディレクトリの例

f:id:rksoftware:20190812162607j:plain

オブジェクト ブラウザの例

f:id:rksoftware:20190812162625j:plain

この事象に対し、リビルドや、クリーン > obj と bin を削除 > リビルド は無力です。

(つづく)

Apple Watch に iPhone の通知を表示する

Apple Watch は素晴らしいデバイスです。しかし、先日まで私の Apple Watch はただ2日に1回充電が必要で、天気気温を表示し、1時間に1回スタンドの時間をおしらせしてくれ、1日の終わりにまだ間に合うあきらめたらそこでムーブ終了ですよと運動を促してくれるおしゃれな腕時計でした。

そう、iPhone の通知が全く表示されなかったのです。

公式アプリ全く使ってないし、何時も使っているアプリが対応してないからなのかな、そう思っていた時期が私にもありました。アラームなんか揺れるし。

■ 一般的な情報

  • Watch と iPhone ペアリングされていて
  • Watch の設定で通知が有効になっていて
  • iPhone 上でアプリの通知が ON になっていれば通知される

いくつものサイトを見て、どのサイトもこれで通知が表示される書かれています。私の設定もそうなっているつもりなのですが、通知はされません。

■ バナー

結論として、通知の設定のアプリの設定で「バナー」を ON にすると通知されるようになりました。

f:id:rksoftware:20190811163803j:plain

画像の右端の選択です。

この設定を ON にしている人、日本では少なさそうに思えるのですが皆さん ON 何でしょうか? ゲームやってるときにバナー通知で画面が塞がれて泣いた経験のある方は相当数いそうに思えるのですが。

■ とりあえず

とりあえず通知されるようなったのでしばらくこのまま使ってみます。

Xamarin Android で Android の ARCore サンプルを書き換えて動かしてみた

今回動かしてみたスクリーンショットです。

f:id:rksoftware:20190811160427j:plain

■ これまでの記事

以前に、Xamarin.Android と Android の ARCore のサンプルを動かしてみました。

その際、Android のサンプルは種類も多く楽し気でしたが、Xamarin はシンプルな一つだけだけでした(だから素の Android でも遊んでみたのです)。

おさらいとして、Xamarin.Android で AR を扱うエクセルソフトさんのエクセルソフト ブログの記事です。

■ おさらい - なぜ今 ARCore なのか

先の記事にもありますが、Pixel 3a を買ったからです。Pixel 3a は比較的安くて ARCore にも対応しています。そして何より、素早い OS アップデートを長く受けとれる全 Android ユーザー夢の電話です。

欠点は、Pixel 3a とタイプするときに間違えて Pixcel 3a を打ってしまうことが2回に1回くらいあることくらいです。Android は今後一生触らない、と固く誓った開発者でなければとりあえず買っておくのが間違いないです。

■ 今回のソリューション

とりあえず動かくことに成功した VS のソリューション(プロジェクト群)を GitHub で管理しています。

まだ、最初の一番シンプルなサンプルだけですが、何とか動かすことができました。ここまで、3週間くらいかかりました。

■ 概要

簡単に言うと Java ライブラリのバインド を行いこれに3週間中3週間苦戦していたからです。

前回そして今回動かす Android のサンプルは、Seceneform というフレームワーク? ライブラリ群? が使用されていて、せっかくなのでこれを機にバインディングに挑戦していました。結果、5つのバインディングライブラリプロジェクトが生まれました。 ※このソリューションは、5つのバインディングライブラリプロジェクトと1つのサンプルアプリプロジェクトが含まれています。

実際にここまでに至る戦いの記録は後日ゆっくり記事にしようと思います。

■ 結論

  • Pixel 3a は買い
  • 正直、バインディングでなく Java ソースを C# に書き換えたほうが早かったのでは?
  • バインディングという戦略の選択は慎重に