【问题标题】:Loading android library加载安卓库
【发布时间】:2015-04-02 01:48:58
【问题描述】:

我有一个这样加载的库:

  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 的文件夹中。这修复了崩溃。

我试图理解这一点。这是否意味着崩溃的手机具有不同的 CPU? CPU 标识符应用程序将其识别为与其他应用程序具有相同的类型(制造商、型号)。即使假设崩溃的手机是armeabi-v7,最受好评的答案here 和接受的答案herehere 听起来就像armeabi-v7 手机应该能够使用armeabi 文件夹中的库.不是这样吗?

最后,有没有更好的方法来解决这个问题,这样我就不会在 apk 中有同一个库的两个相同副本?

【问题讨论】:

    标签: android android-library unsatisfiedlinkerror


    【解决方案1】:

    首先,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(),而不是依靠框架包管理器系统将您的库膨胀到您的安装应用时应用的数据目录。

    【讨论】:

      【解决方案2】:

      事实证明,这是由于在手机上的 /system/priv-app 中安装了另一个版本的应用程序造成的。删除那个可以防止崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多