CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Babylon Nativeを使ったネイティブアプリ開発 (Android)

Babylon.jsはJavaScript/TypeScriptを使ったフレームワークのため、ブラウザ用コンテンツを作るのが基本的な使い方です。

一方、Babylon.jsで書いたコードを元に、Windows/iOS/Androidのネイティブアプリを開発する「Babylon Native」という方法もあります。

Babylon Native自体はGitHubで公開されています。しかし、これを使ってビルドしてアプリを作ったという情報は、イワケンさんiOSアプリビルドしか見つけられませんでした。

また、Androidについては情報がありませんでした。そこで、今回はBabylon NativeでAndroidアプリをビルドするまでの手順を整理しました。

今回のビルド対象はAndroidです。

使用した環境
・Windows11 Pro
・Android Studio : Jellyfish | 2023.3.1
・Cmake : 3.29.3
・Ninja : 1.12.1
・Node.js: 22.1
・Git for Windows : 2.45.0
・Surface Duo (Android 12)

1. Babylon Nativeとは

Babylon.jsの公式HPで記載されています。

www.babylonjs.com

"Get the preview"とあるように、まだ完成はしていないようです。Babylon.jsでコードを書いて、それをVisual Studio、Xcode、Android Studio上でビルドすると、それぞれのネイティブアプリケーションになります。

主な対応関係は以下の通りです。

Visual Studio : Windows、HoloLens2アプリ

Xcode : iOS、Macアプリ

Android Studio : Androidアプリ

GCC: Linuxアプリ

なお、現時点では、Androidアプリを作るにはWindows環境を準備する必要があります。Mac環境は非対応のようです。
また、Babylon.jsの全ての機能をアプリ化できるわけではないと書かれています。詳細はGitHubリポジトリのReadmeをご確認ください。

2. 環境構築からapkビルドまでの手順

ソースコードおよび基本的な使い方はこちらにあります。

github.com

(1) git, CMake, node.jsをインストールする

・Git for Windows
https://git-scm.com/

・CMake
https://cmake.org/

・node.js
https://nodejs.org/en/

(2) Android Studio, Ninjaをインストールする

・Android Studio
https://developer.android.com/studio

・Ninja
https://ninja-build.org/

(3) PowerShellを管理者権限で開いて、Get-ExecutionPolicyを実行する

このようにRestrictedと表示された場合は(4)を実行。

$ Get-ExecutionPolicy
Restricted

(4) PowerShellでSet-ExecutionPolicyを実行する

$ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

(5) Appsフォルダでnpm iを実行する

$ pwd
BabylonNative-master/Apps/

$ npm i

(6) Apps/Playground/Androidフォルダを指定してAndroid Studioで開く

gradleのビルドが始まります。数分かかります。

(7) AndroidManifest.xmlの中でexported="true"を追加する

Android/app/src/AndroidManifest.xmlです。Android 12以降は必要な対応のようです。

gist.github.com

(8) build.gradleに記載されているCmakeのバージョンを、自分の環境と合わせる

Android/app/build.gradleです。

gist.github.com

私がcloneした時点のリポジトリでは3.19.6と書いてありました。今回は3.29.3を使ったので書き換えました。

(9) AndroidのAPIバージョンを使用するデバイスに合わせる

Android/app/build.gradleです。

私がcloneした時点のリポジトリではtargetSdkVersion 21でした。今回の31に合わせました。

gist.github.com

(10) Ninjaのパスを登録する

Ninjaをダウンロードすると、ninja.exeが取得できます。これをc:ninjaとしてCドライブ直下にninjaフォルダを作り、c:ninja/ninja.exeとします。

次に、Windowsの環境変数のPATHにc:ninja/を追加します。

(11) Android Studioを動かしているPCとAndroidデバイスを接続し、デバイスが認識できたらRunを押します。APKビルド、転送が実行されます。

実行すると、このようになります。AndroidアプリとしてBabylon.jsの中身を動かすことができています。

youtu.be

3. 表示内容を変更する方法

Apps/Playground/Scripts/experience.js の中を変更します。

cloneしたときは"CreateBoxAsync(scene).then(function () {"が有効化されています。

gist.github.com

先ほどの動作確認の動画では、コメントアウトされているBoomBox.gltf"を読み込むように書き換えていました。

4. ビルドエラーと対処法

検証中に確認したエラーコードと対処法です。対処法に書かれた番号は、上の(1)~(11) です。

4.1 npm : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\npm.ps1 を読み込むことができません。

npm : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\n
odejs\npm.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(ht 
tps://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ npm i
+ ~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

原因は、PowerShellの実行ポリシーに制限がかかっていたためでした。こちらのリンクを参考にしました。

実行ポリシーについて - PowerShell | Microsoft Learn

対応方法:(3)

4.2 android:exported needs to be explicitly specified for element

android:exported needs to be explicitly specified for element <activity#com.android.babylonnative.playground.PlaygroundActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

こちらを参考にさせていただきました。

qiita.com

対応方法:(7)

4.3 [CXX1429] error when building with cmake using~

[CXX1429] error when building with cmake using C:\Users\limes\Documents\BabylonNative-master\BabylonNative-master\Apps\Playground\Android\app\CMakeLists.txt: -- Android: Targeting API '21' with architecture 'arm64', ABI 'arm64-v8a', and processor 'aarch64'

対象とするデバイスのAPI レベルが合っていないためでした。

対応方法:(9)

4.4 [CXX1416] Could not find Ninja on PATH or in SDK CMake bin folders.

ninja.exeが環境変数として登録されていないためでした。

対応方法:(10)

4.5 CMake Error at C:/Program Files/CMake/share/cmake-3.29/Modules/ExternalProject.cmake:2945

CMake Error at C:/Program Files/CMake/share/cmake-3.29/Modules/ExternalProject.cmake:2945 (message):
  error: could not find git for clone of cmakeextensions-populate

git for Windowsがインストールされていないためでした。

対応方法:(1)

5. iOSビルドの場合

iOSビルドについてはイワケンさんが確認されておりました。こちらにリンクを共有します。 BabylonJS Native iOS

6. おわりに

Android Studioを長く使ってなかったので、ビルド関係の設定に手間取りました。

GitHubリポジトリのReadmeを見る限り、だいたいのことはできそうな感じです。特にWebXRサポートとあるので、VRコンテンツを作ってQuest3やApple Vision Proなどで動かすこともできるように思います。
そのあたりはまた機会見て試してみます。