is 32-bit instead of 64-bit动态库错误分析
2016-07-20 23:07
561 查看
前段时间因项目需要,需要MP3格式的录音,需要引用LAME开源库,在引用so库文件时,提示java.lang.UnsatisfiedLinkError: dlopen failed: "liblame.so" is 32-bit instead of 64-bit错误,网上分析了出现这种情况的原因,可能是混合使用了32bit和64bit的库文件,如果系统先使用64bit的库文件时,则后续的库文件都是以64bit来加载执行,故会出现此问题。
针对第三方应用,在它安装的时候,安装包管理器会检查该应用是否使用native libraries,如果使用本地库文件的话,则会根据相应的架构abi来选择是32bit还是64bit。
针对系统应用来说,它的库文件存放在/system/lib,所以无法确定该应用是否依赖其他应用在system/lib下的库文件。因此安装包管理器,无法确定系统应用使用哪种架构abi,故在64bit模式下运行。
当你安装应用到系统时,系统会从lib目录下的(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips)文件夹中查找本地库文件,不同的架构加载不同的文件夹下的库文件。例如64bit的架构从arm64-v8a、x86_64、mips64这些目录中加载。如果你的arm64-v8a文件夹下刚好有这个需要使用到的库文件,则不会从其他文件夹如armeabi加载该库文件。此时就会出现32bit库文件和64bit库文件混合使用的情况,但是32bit的库文件不能和64bit的库文件不能混合使用。因此,有一种解决办法是过滤掉64bit的库文件,全部使用32bit的库文件。在Android
studio配置文件build.gradle(Module APP)中配置如下:
android
{
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
还有一种解决办法是生成64bit库文件,具体的做法如下,在jni目录下创建一个Application.mk文件,定义需要生成的abi架构库文件。64bit库文件可以选择arm64-v8a abi架构。
其中APP_MODULES 是需要生成的模块名字,在Android.mk文件的LOCAL_MODULE中定义。
APP_ABI,默认情况下,NDK的编译系统根据
"armeabi" ABI生成机器代码。可以使用APP_ABI 来选择一个不同的ABI。这里选择arm64-v8a来表示需要生成64bit的库文件。
注意,如果需要编译64bit库文件,需要使用64bit的ndk版本。64bit ndk下载。
编译出64bit 的库文件之后,用该库文件替换32bit 库文件,就可以解决该问题。
参考链接:
http://stackoverflow.com/questions/27712921/how-to-use-32bit-native-libraries-on-64-bit-android-l-platform
http://stackoverflow.com/questions/30782848/how-to-use-32-bit-native-libaries-on-64-bit-android-device
针对第三方应用,在它安装的时候,安装包管理器会检查该应用是否使用native libraries,如果使用本地库文件的话,则会根据相应的架构abi来选择是32bit还是64bit。
针对系统应用来说,它的库文件存放在/system/lib,所以无法确定该应用是否依赖其他应用在system/lib下的库文件。因此安装包管理器,无法确定系统应用使用哪种架构abi,故在64bit模式下运行。
当你安装应用到系统时,系统会从lib目录下的(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips)文件夹中查找本地库文件,不同的架构加载不同的文件夹下的库文件。例如64bit的架构从arm64-v8a、x86_64、mips64这些目录中加载。如果你的arm64-v8a文件夹下刚好有这个需要使用到的库文件,则不会从其他文件夹如armeabi加载该库文件。此时就会出现32bit库文件和64bit库文件混合使用的情况,但是32bit的库文件不能和64bit的库文件不能混合使用。因此,有一种解决办法是过滤掉64bit的库文件,全部使用32bit的库文件。在Android
studio配置文件build.gradle(Module APP)中配置如下:
android
{
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
还有一种解决办法是生成64bit库文件,具体的做法如下,在jni目录下创建一个Application.mk文件,定义需要生成的abi架构库文件。64bit库文件可以选择arm64-v8a abi架构。
APP_MODULES := JNITest APP_ABI := arm64-v8a
其中APP_MODULES 是需要生成的模块名字,在Android.mk文件的LOCAL_MODULE中定义。
APP_ABI,默认情况下,NDK的编译系统根据
"armeabi" ABI生成机器代码。可以使用APP_ABI 来选择一个不同的ABI。这里选择arm64-v8a来表示需要生成64bit的库文件。
注意,如果需要编译64bit库文件,需要使用64bit的ndk版本。64bit ndk下载。
编译出64bit 的库文件之后,用该库文件替换32bit 库文件,就可以解决该问题。
参考链接:
http://stackoverflow.com/questions/27712921/how-to-use-32bit-native-libraries-on-64-bit-android-l-platform
http://stackoverflow.com/questions/30782848/how-to-use-32-bit-native-libaries-on-64-bit-android-device
相关文章推荐
- Android NDK开发之:配置环境的详解
- Android开发的IDE、ADT、SDK、JDK、NDK等名词解释
- Android提高之使用NDK把彩图转换灰度图的方法
- Android NDK 生成以及调用so 文件
- 探讨:如何在NDK中呼叫Java的class
- Android App 增量更新实例(Smart App Updates)
- 每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理
- Mac下用Android Studio运行NDK samples
- 用Android Sutdio调试NDK
- Android NDK开发简介
- Android NDK开发之Jni的数据类型
- Android NDK开发之数组类型的操作
- Android NDK开发之Jni调用Java对象
- Getting Started With the NDK(Pro Android Apps Performance Optimization)
- Advanced NDK(Pro Android Apps Performance Optimization)
- Android新版NDK环境配置(免Cygwin)
- android ndk 怎样调用第三方的so库文件
- Android 开发 ndk相关问题
- Android: NDK编程入门笔记