我目前正在开发一款流媒体广播的安卓应用程序。我使用了一个名为aacdecoder的本地解码器库。一切都很好,直到程序在一些安卓设备上崩溃报错。这真的很烦人,因为应用程序几乎可以在所有设备上完美地播放广播流,但是不能在三星S6和S6 Edge上播放。
崩溃报告显示:
Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libaacdecoder.so”
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:988)
at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187)
你看到这个崩溃报告说它无法加载本地库。但是原因是什么呢?首先我检查了我的结构,如果本地库.so文件被正确地放置。
似乎除了这个疯狂的错误以外一切都没问题。然后经过一些研究,我发现一些Android设备有64位处理器。这些设备会生成并检查arm64文件夹来加载本地库。这就是问题所在。因为我的项目没有arm64文件夹。以下是解决方案;
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
}
}
你需要将这些过滤器(abiFilters)添加到您的应用程序模块的build.gradle文件中。因此,当您的设备尝试运行您的应用程序时,它将检查gradle文件并了解它不应生成任何文件夹并使用现有的本地库资源。嘭,问题基本上已经解决。但还有一件事情。
android.useDeprecatedNdk=true
将以下代码添加到gradle.properties中以使用已弃用的Ndk。
最终我的应用程序可以在S6和S6 Edge上运行。我是指它可以在任何拥有新的64位处理器的设备上运行。
更新:
截至2019年12月,armabi和mips已被弃用。支持的ABI为[arm64-v8a,armeabi-v7a,x86,x86_64]
因此,您的代码应该像这样:
defaultConfig {
...
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
}
}
at java.lang.Runtime.loadLibrary(Runtime.java:367)```
- Sana Ebadi