開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

Android Studio使っていてJNIのSystem.loadLibraryでエラー

 JNIで使う.soライブラリが見つからなかったりすると次のようなエラーが出ます。

java.lang.UnsatisfiedLinkError: Couldn't load PQAMakerJNI from loader dalvik.system.PathClassLoader: findLibrary returned null
            at java.lang.Runtime.loadLibrary(Runtime.java:358)
            at java.lang.System.loadLibrary(System.java:526)

 でもndk-buildしてちゃんと.soファイルは生成できているはず。
 そんなときは、ライブラリの場所がコンパイラにちゃんと伝わっていないのが原因かもしれません。

 たぶん.soファイルは/[app]/src/main/libsに生成されているかと思います。

f:id:hihokaruta:20150101222451p:plain

 しかし、デフォルトの設定でライブラリを探す場所は/[app]/src/main/jniLibsです。
 OpenCVなどで静的ライブラリを利用するときはここに配置するかと思います。

 解決策は以下の2つあります。

  • build.gradleをいじってsrc/main/libsからも探すようにする
  • src/main/libs以下のファイルをsrc/main/jniLibsにコピーする

 1つ目の方を詳しく説明すると、以下のようにjniLibs.srcDirsを変更すればOKです。

build.gradle

apply plugin: 'com.android.application'

android {
    ...

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/libs', 'src/main/jniLibs'] // Here!
        }
    }
}

dependencies {
    ...
}