2023/10/26(木)

昨日に引き続き以前作ったPICO4向けのアプリに関する作業をした。とりあえず前作ったときと同じマシンでビルドしたらビルドが通ったのだが、別のPCでビルドしようとしたら通らない。これは困る。

すごい頑張った結果、vcpkgでビルドされたOpenALが諸悪の根源っぽいことが分かる。OpenALをリンクすると死ぬ。エラー内容としてはリンカエラーで「__register_atfork 関数が定義されていない」とのこと。

エラー文で調べてみると「__register_atfork関数が定義されていないという不具合はandroid23で修正された」とのこと。バージョン問題なのかと思ったが、APIバージョンもNDKバージョンも十分高く、結局これは全く無関係の情報だった。

次に実験として、OpenALをリンクしていない場合に__register_atfork関数が参照できるかを確かめる。これはなんと普通に可能だった。そしてリンクしたとたんにダメになる。ということはOpenALをリンクするところで何か躓いている可能性が高い。我々は真相を確かめにvcpkgのinstalledフォルダへ向かった。

OpenALTargets.cmakeファイルの中身を確かめてみるといくつかのライブラリのリンクが行われている箇所を発見。

INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:-pthread>;C:/Users/user1/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21/libOpenSLES.so;\$<LINK_ONLY:dl>;\$<LINK_ONLY:log>;\$<LINK_ONLY:atomic>;\$<LINK_ONLY:m>"

1つずつコメントアウトして実験したところ、どうやらOpenSLESのリンクをトリガーにしてエラーが起きる。ここでちょっと違和感を感じたのだが、OpenSLESはAndroidNDK開発なら普通に-lOpenSLESのように指定すればリンクされるはずである。絶対パスで指定されているのは何かおかしい。そこで以下のように直したところ、なんとビルドが通ってしまった。

INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:-pthread>;\$<LINK_ONLY:OpenSLES>;\$<LINK_ONLY:dl>;\$<LINK_ONLY:log>;\$<LINK_ONLY:atomic>;\$<LINK_ONLY:m>"

OpenSLESを絶対パス指定したときに`__register_atfork`関数が飛ぶ機序は全く不明だが、とにかくこれで解決した。vcpkgからOpenALを使うと色々厄災が起こりすぎる気がする。


なお、副産物というか回り道の結果だが、PICO4上のアプリはNativeActivityではなくGameActivityでも問題なく動くことを確認できた。VRasterをバージョンアップさせる際はGameActivityに対応させておきたい。

基本的な手順はこの記事に従ったのだが、いくつかこれだけでは済まない点があった。

https://developer.android.com/games/agdk/game-activity/migrate-native-activity?hl=ja

  • build.gradleのandroidブロックの中に以下の記述を入れた。
    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }
  • 同ファイルのdependenciesの中に以下の記述を入れた。
    implementation 'androidx.appcompat:appcompat:1.6.1'
  • ANativeActivity_xxx系の関数をGameActivity_setWindowFlags_xxx系関数に変えた。

Categories: