• スポンサードリンク

stlport_sharedでクラッシュ(´・ω・`)

Android NDK

定番ですが、Android NDKでSTLを使いたい場合には、Application.mkに

とか、

を書き加えます。APP_STLに指定できるのは

ライブラリ名静的ライブラリ共有ライブラリ
STLPortstlport_staticstlport_shared
GNU STLgnustl_staticgnustl_shared
c++c++_staticc++_shared
systemsystem
gabi++gabi++_staticgabi++_shared

7種類9種類ですが、上の表の下2行(system/gabi++)はSTLには対応していません。後は、ソースファイル内で使いたいクラスのヘッダーをインクルードすれば使えます。
ちなみに、3行目のc++はAndroid NDK r9dで実験的に追加されたlibc++ライブラリを使う場合です。自分ではまだ使ったことは無いですけど。
NDK r9dで追加されたlibc++を追記しました

ここからがよくわからないとこなのですが、共有ライブラリとしてリンクした場合(APP_STLにstlport_sharedまたはgbustl_sharedを指定した場合)でも、手持ちの機種の内Nexus7(2012, Android4.2.2)とかNexus5(4.2.2)だと自前でライブラリを読み込まなくても特に問題なく動きますが、logCatにはlibstlport_shared.soを読み込んだぜ、みたいなメッセージは出てきません。

クラッシュする機種があるんやけど

ところが、手持ちの機種だとGalaxy S3(SC-06D, Android4.1.2)では
java.lang.UnsatisfiedLinkError: could not load needed library ‘libstlport_shared.so’
(load_library[1093]: Library ‘libstlport_shared.so’ not found)と出てクラッシュします。
この現象がGalaxy S3固有なのか、Samsung固有なのか、Android4.1.2固有の事なのかはわかりません。
libstlport_shared.soはlibs配下のarmeabi-v7aとかarmeabi内に存在していますが、どうやらAndroidのシステム内から読み込もうとして見つからへんって怒っているようです。
かといって、adbで覗いた限りでは、クラッシュせずに実行できるNexus7やNexus5のシステム内にもlibstlport_shared.soは含まれてなさそうです(libstlport.soはどの機種でも存在してました)。

対策・・・というほどの事では無いけど

UnsatisfiedLinkErrorのいつものパターンなので対策と言うほどでは無いですが、STLを使った共有ライブラリを読み込む前に、
System#loadLibraryでlibstlport_shared.soを読みこめば大丈夫でした。まぁ普通の事ですね(-_-;)
例えばこんな感じ。

このコードを追加しても、当然ながら元々クラッシュせずに実行できる機種でも特に問題は起こりませんでしたが、logCatにlibstlport_shared.soを読み込んでやったぜって出るようになりました。
ちなみに、Android.mkに

としてもダメでした。LOCAL_LDLIBSはAndroidのシステム内に含まれる共有ライブラリ限定みたいですね?

まとめ

共有ライブラリを使う時は、ちゃんと全部自前で読み込んでおきましょうって事ですよね。でも以前書いたように、共有ライブラリによっては、自前で読み込んでも大丈夫じゃない時があるのが辛いところです。
気持ち悪いのは自前で読み込まなくても実行出来る機種があるってことで。特にネイティブ回りはドキュメントになってない挙動を示すのが多いよなぁ。
もう一つ気持ち悪いのは、いつもの事ながらstatic library(静的ライブラリ)に対応するのがshared library(共有ライブラリ)なところで。staticの反意語はdynamicやと思うんやけど・・・大したことではないですけどね。

と言うことでおしまいです。お疲れ様でした。

« »

  • スポンサードリンク