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 を使わなかったので容量が小さくなるかもしれないし、そっちでいいかなーくらいの感覚でそうしたと思います。実際のところ、ほとんどサイズは変わりませんが……