2022/10/29(土)

(記: 2022/10/31)

PICO4の研究を進めた。というより、どちらかというとAndroid NDK開発の研究になった。

Android NDKのバージョンとの格闘

いろいろとバージョン問題が面倒。

  • gradleのバージョン
  • gradle Androidプラグインのバージョン
  • ビルドターゲットとするAndroid SDKのバージョン
  • 動作ターゲットとするAndroid SDKの最低バージョン
  • Android NDKのバージョン
  • ビルドツールチェーンのバージョン

主要なあたりでもこれだけのものを気にする必要があり、それぞれ依存関係を持っている。全部考えて選ばないといけないというよりは、「一つ決めると他の何かも引きずられて決まるがそれによって色々問題が発生しうる」という部分で面倒な感じ。

結局gradle7.3.1でビルドターゲットは30、最低バージョン26とかにした。ビルドツールチェーンは最新33から変えようがない。

vcpkgとAndroidNDKの連携

基本的にここを参照した。

https://github.com/microsoft/vcpkg/blob/master/docs/users/android.md

環境変数でAndroid NDKのディレクトリを指定しなければならない。しかし上に書いたようなバージョン問題との格闘をしながら導入したため、何回かパッケージを入れ直す(ビルドし直す)羽目になった。また、ターゲットとするプロセッサ(armとかarm64とか)もCMakeの引数として指定しなければならないのだがここで問題発生。CMakeはgradleのスクリプトから呼び出す形になっている。gradleのAndroid NDKを扱うスクリプトの中でターゲットCPUの情報を手に入れる方法が分からない。結局のところPICO4でさえ動けばいいやとターゲットCPUを1つに絞ってCMakeの引数はハードコートすることにした。PICO4はarm64らしい。

OpenAL-softの設定

VRasterのソースコードを流用しているためOpenAL-softを入れたのだが、OpenAL-softはAndroid環境におけるバックエンドとしてOpenSLESを利用しているらしい。それはいいとして、vcpkgでOpenAL-softを入れると「OpenSLES」ではなく「OpenSL::OpenSLES」を求めてくる。CMakeでOpenSLESはリンクしているのに文句を言ってくる。らちが明かない。

ALIASで別名を付けられるのでは?とか考えたが、CMakeのALIASという機能はこの場合使えないということだった。あまりちゃんと理解できていないのだが。

結局vcpkgのinstalledフォルダを見てOpenAL-softの読み込みスクリプトを編集し、OpenSL::OpenSLESではなくOpenSLESを求めるように書き換えた。かなりの力業だがなんとか通った。

Vulkan-Hpp問題

VRasterのソースコードではVulkan-Hppを用いているのだが、vcpkgで入れられるvulkan.hppはvulkan 1.2.203向けのものだった。Android NDK 20.0.5xxxに同梱されているvulkanは1.2.102。バージョンが合わないため怒られる。Vulkan-HppのGithubリポジトリを見に行って正しいvulkan.hppを持ってくることを画策するも、そもそもVulkan1.2.158より古いものは置いていない。仕方なくAndroid NDKのバージョンを上げることになった。最初に書いたバージョン問題との格闘の7割はこれが原因で引き起こされた。

最終的に上に書いたようなバージョン構成となり、Android NDKのバージョンは23.1.xxxとなる。vulkan のバージョンは1.2.158となり、Vulkan-Hppリポジトリにある最古のvulkan.hppなら使えることになった。

xrInitializeLoaderKHRの処理

Android環境でOpenXRを使う際特有の事情として、xrInitializeLoaderKHRを呼び出して初期化処理をやる必要があるらしい。あとXrInstanceCreateInfoにXrInstanceCreateInfoAndroidKHRをチェーンする必要がある。プラットフォーム依存のコードも意外と書かなければならないようだった。


いろいろやったがこの日は上手く動かず終了。

Categories: