Android的NDK开发中的UnsatisfiedLinkError

478 查看

首先UnsatisfiedLinkError的种类很多,我这里遇到的是

java.lang.UnsatisfiedLinkError:
nativeLibraryDirectories=[*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libmytool.so"

可以看到我这里主要是因为在这几个文件夹中都没有找到我的so库导致的。
仔细一看,我的jniLibs中确实只有一个armeabi-v7文件夹,于是我添加了如下的文件夹:

然后在各个文件夹中,都把我的so文件放了一份。
但是直接跑,发现它提示我的so文件是一个32bit的:

 java.lang.UnsatisfiedLinkError: dlopen failed: "****/lib/arm64/libmytool.so" is 32-bit instead of 64-bit

经过下面两篇文章的指导:

http://stackoverflow.com/questions/27186243/use-32-bit-jni-libraries-on-64-bit-android
https://corbt.com/posts/2015/09/18/mixing-32-and-64bit-dependencies-in-android.html

我在build.gradle中添加了下面的部分:

android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    ……
    ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }
}
buildTypes {
    ……
}
sourceSets.main {
    jni.srcDirs = ['src/main/jni','src/main/jniLibs']
    //这个地方也是一个容易出错的地方,虽然默认的jni目录是'src/main/jni',但是so文件直接放进去经常会出错,一般会在jni中放c文件,然后在同级目录下创建一个jniLibs文件夹用于放so库
}

}
可以看到,在我加了

 ndk {
        abiFilters "armeabi-v7a", "x86"(后面还可以加其他的,但是我这里只加了x86就可以跑了)
    }

之后,等于对原来的jni中的文件夹做了一个筛选,只选入了这里标识的"armeabi-v7a"和"x86",所以不会再导入arm64中的文件,因此也不会出错了(arm64中的自然都应该是64位的库,而"armeabi-v7a"和"x86"则可以是32位的)

不过我还是很疑惑,为什么这个破手机提示我在下面的文件夹中没有找到so库,然而我加的文件夹是x86啊,跟这些文件夹也搭不上关系…不知道为啥就能跑起来了。我感觉,嗯,很奇葩。

*****/lib/arm64, *****/lib/arm64-v8a, /vendor/lib64, /system/lib64]]

注:笔者当时用的是某菊花场的手机进行的测试…算了不提了…