いさぽん部屋(isapon.com)

ゲーム系プログラマによる特に方針のないブログ。技術系とカレー、ラーメンネタ多めだったはずが、最近はダイエットネタ多め。

C++11の落とし穴。functionalがあると思うなよ。…あった!

先日 Android NDK で functional が無いと書いたのですが、訂正です。ありました functional。

結論

Application.mk は

APP_STL := c++_static

に、せいっちゅーこっちゃ。

説明

jniをビルドするときに Application.mk を書く必要があり、その中で使用するSTLを選択することができます。今までは

APP_STL := c++_shared

としていたのですが、これを先ほどのように

APP_STL := c++_static

に変えるだけ。どうやら、Androidの中に入っているC++の共有オブジェクトは functional が含まれていないようですが、アップデートされた NDK にはちゃんと functional が入っているようです。そりゃそうか、もう Android が出てから何年経つんだって話です(逆に言えば共有オブジェクトのlibc++が何年前のかということだ)。

ちゃんと調べていませんが、たぶんこういうこと。

俺の場合実際にリリースするときは別にしても、開発中はなるべくAPI Level 10で開発しています。つまり Android 2.2.3 以降なら動くようにするってことです。これは、単になるべくOSの機能に依存しないでプログラムを構築するために、意図的にバージョンを下げて作っています。Android 2.2.3 が出たのが2011年の初めのほうだったはずなので、そりゃC++11の仕様フィックスの前だし、Android 2.2.3 の中にはまだ未実装の共有オブジェクトしかなくて当然です。

その点、staticライブラリならNDKに梱包されているライブラリになるわけですから、最新のものが含まれていると。まぁ当たり前っちゃ当たり前ですね。

なぜに shared を使っていたかというと「前にそう書いてそのままだったから」というのが理由です。たぶん、そんときは C++11 を使わなかったので容量が小さくなるかもしれないし、そっちでいいかなーくらいの感覚でそうしたと思います。実際のところ、ほとんどサイズは変わりませんが……