首先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]]
注:笔者当时用的是某菊花场的手机进行的测试…算了不提了…
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。