ネイティブのライブラリを使用しているとあるプロジェクトをEclipseからAndroidStudioに手動で移行する際、ビルドは通るけど端末で実行時にエラーが出てアプリが強制終了するという現象が発生した。
ネイティブライブラリを使ったプロジェクトの移行時によくあるハマりどころみたいなので、対策方法をメモっておく。
UnsatisfiedLinkError
アプリが強制終了した際のログを確認するとjava.lang.UnsatisfiedLinkError: Native method not found:
と出力されていた。
UnsatisfiedLinkErrorというのは初めて見たが、どうやらネイティブライブラリのリンクにミスっているせいで、ネイティブメソッドを呼び出している箇所で落ちているらしい。
ネイティブライブラリ(.soファイル)がプロジェクトに追加できていることは確認済みなので、恐らくbuild.gradleの設定が間違ってるんだろうと思ってググってみると同じ現象で困っている人の相談が大量に見つかった。
原因はやはりbuild.gradeの設定が間違っているということで、以下のように記述して適切なフォルダ構成にすることでビルド時にちゃんとネイティブライブラリが含まれて、実行時エラーが発生しなくなった。
1 2 3 4 5 6 7 8 9 10 11 12 |
android { compileSdkVersion 22 buildToolsVersion "22.0.1" ~~中略~~ sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } |
main以下にjniLibsフォルダを作成し、その中にフォルダ構成を維持したまま各プラットフォームごとの.soファイルを追加してやると、無事に.soファイルがビルド生成物に含まれるようになる。最終的なフォルダ構成はmain/jniLibs/armeabi/hoge.so
みたいな感じ。
ちなみに上記の設定はjniLibs.srcDirs
に配列をセットしていることから察しがつくとおり、複数のディレクトリを指定することができるようである。また任意の値をセットすることでjniLibs以外の任意のフォルダを指定することもできるらしい。
ただ基本的には標準構成どおりにjniLibsフォルダにまとめておくのが無難ですかね。
参考
Android Studio – Native method not found – Include .so file in build