Open3

em2native: Android(NDK)対応

okuokuokuoku

(どこかのタイミングでPure Java版もやりたいけど、AndroidのJavaランタイムは割とスケーラビリティが犠牲になっているので、WASM部分だけNDK、残りがJavaみたいな分割になりそう。。)

AndroidはWindowsやiOSと異なりネイティブのexecutableを直接アプリケーションとして実行する機能がなく、アプリケーションは共有ライブラリ(DLL)としてビルドし、Javaで書いたアプリケーションからロードして実行してやる必要がある。 ...実際にはNDKは NativeActivity としてJavaコードなしでもプロジェクトをビルドできるように配慮しているものの、パッケージングをなんとかする必要があるためJavaのビルドシステムを避けるのは難しい。

今回は:

  1. Android Studioプロジェクトのテンプレートを用意して、そのテンプレートから必要事項(アプリ名とかmanifestの.xmlとか)を埋めて実際のプロジェクトを作成するCMakeプロジェクト
  2. ↑ 1. のプロジェクトから呼び出されて実際の .so(アプリ本体) をビルドするCMakeプロジェクト

の2段構成でアプリケーションをビルドする。

okuokuokuoku

NDKパスの設定

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> NDK not configured. 
  Download it with SDK manager.

Android Studioの"Project Structure" → "SDK Location"からダウンロードできる。

でもダウンロードしてもダメじゃん。。

> Configure project :app
NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory.  It is currently set to F:\android-sdk\ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.

SDLのプロジェクトで使っているGradleやAndroid Pluginがかなり古かった。。同じ"Project Structure"ダイアログから更新を掛けたら治った。

diff --git a/package/android/android-project/build.gradle b/package/android/android-project/build.gradle
index f6f90b2..cf780a6 100644
--- a/package/android/android-project/build.gradle
+++ b/package/android/android-project/build.gradle
@@ -6,7 +6,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.2.0'
+        classpath 'com.android.tools.build:gradle:4.1.3'

         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
okuokuokuoku

うごいた

どうやってもファイルコピーだけをするビルドルールが上手に書けなかったので、アセットファイル1つ1つに連番を振ってターゲット名とし、それを最終 .so の依存関係に入れて無理矢理ビルドさせた。もうちょっと綺麗な書き方があるような気はする。。

https://github.com/okuoku/em2native-proto/commit/d6e2d942e597190989e8e5bb144b8e5cda4aca2d

まだテンプレート部分をSDLからコピーしたままだけどまぁ動作はするから後回しだな。。