正在加载 android 个库

Loading android library

我有一个像这样加载的库:

  static {
    System.loadLibrary("myLibrary");
  }

这在大多数设备上都能正常工作。但是,在一台设备上,它会导致此堆栈跟踪崩溃:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file "/vendor/overlay/myBuild.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "myLibrary.so"
 at java.lang.Runtime.loadLibrary(Runtime.java:366)
 at java.lang.System.loadLibrary(System.java:989)
 at com.sony.foo.bar.<clinit>(myClass.java:20)

接受的答案 here 提示我尝试将 myLibrary 的副本添加到新的 armeabi-v7 文件夹中,其中原始库位于名为 armeabi 的文件夹中。这修复了崩溃。

我正在尝试理解这一点。这是否意味着崩溃 phone 具有不同的 CPU? CPU 标识符应用将其标识为与其他应用具有相同的类型(制造商、型号)。即使假设崩溃的 phone 是 armeabi-v7,投票最多的答案 here and the accepted answers here and here 听起来像 armeabi-v7 phone 应该能够使用 armeabi-v7 中的库=14=]文件夹。不是这样吗?

最后,是否有更好的方法来修复此问题,这样我就不会在 apk 中拥有同一个库的两个相同副本?

首先,Android中没有armeabi-v7这个名字,正确的名字是armeabi-v7a

armeabi-v7aarmeabi 下的库实际上并不相同。如果您向文件 Application.mk 中的 APP_ABI 添加更多值,如下所示

APP_ABI := armeabi armeabi-v7a mips x86

ndk-build之后,会在libs/armeabilibs/armeabi-v7alibs/x86libs/mips文件夹中生成四种库。通过比较 libs/armeabilibs/armeabi-v7a 中的文件,您会发现它们并不相同。到目前为止,我无法分辨它们的区别。这两个库的大小略有不同,所以我认为它们之间没有太大的区别。

为了让您的应用在大多数 Android 设备上得到广泛支持,您最好添加 armeabi-v7a 支持并保留 armeabi-v7a 目录。

如果你确定自己在做什么,只保留armeabi。然后,您可以将您的库放在 assets 目录下,当您的应用程序启动并 运行 时,您应该从 assets 读取您的库并手动加载 System.load() 而不是依赖框架包管理器系统,可在您安装应用程序时将您的库扩展到应用程序的数据目录。

这原来是由于在 /system/priv-app 的 phone 上安装了另一个版本的应用程序造成的。删除那个防止崩溃。