arm64-v8a调试记录

最全面平台编译设置  '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文件,此时不会报错,成功运行


你可能感兴趣的:(开发工具)