最全面平台编译设置 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64'
ndk {
platformVersion = 14
moduleName = 'un7z'
toolchain = 'clang'
stl = 'gnustl_static'
CFlags.add('-UNDEBUG')
cppFlags.addAll(['-std=c++11', '-Wall'])
ldLibs.addAll(['log', 'GLESv2', 'android', 'OpenMAXAL'])
abiFilters.addAll(['arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64'])
}
在编译的时候没有任何问题,但是安卓5.0开始支持32位和64位的硬件平台,在64位出现错误:
java.lang.UnsatisfiedLinkError: dlopen failed: “jdimage.so”
原因分析
apk包在安装的时候,系统会把包中与自己的abi对应的lib目录中的so库文件拷贝到system分区中,32位机器中只有一个目录/system/lib,64位机器中有两个目录/system/lib和/system/lib64,app启动进行链接时,64位机器中会先到/system/lib64目录中去找,如果没有找到再到/system/lib目录中去找。如果你把32位的so库拷贝到了lib64目录中,会导致链接失败,同样,64位的so库被拷贝到lib目录中也会导致失败,所以so库要和目录一一对应。
如果我们的工程的so库目录中没有arm64目录,默认情况下,Android Studio会在apk中自动创建一个空的arm64-v8a文件夹,并根据一些规则把某些so库(具体是怎样的规则,我也不知道)拷贝到这个目录中,这样就导致,在64位机器上在lib64目录下找到的so库并不是正确的so库文件,从而出现了上面的错误
解决方案也很简单,在build.gradle中加上,这句话的意思大概就是,告诉程序加载如下的so文件
defaultConfig { ...... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } }
这时会报错,因为gradle的配置中,并不知道是否要做操作系统的兼容,这时只要在gradle.properties文件中加上
Android.useDeprecatedNdk=true
就可以了。
说明:不去配置64位的,开启兼容,程序找不到64位arm64-v8a文件夹,程序会自动加载32位的so文件,此时不会报错,成功运行