加载android库

时间:2015-02-03 00:11:26

标签: android android-library unsatisfiedlinkerror

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

  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也会让{1}}手机听起来像应该能够使用armeabi-v7文件夹中的库。这不是这种情况吗?

最后,是否有更好的方法来修复此问题,以便我在apk中没有相同库的两个相同副本?

2 个答案:

答案 0 :(得分:1)

首先,Android中没有此类名称armeabi-v7,正确的名称为armeabi-v7a

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

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(),而不是依赖于框架包管理器系统在安装应用程序时,将库扩展到应用程序的数据目录。

答案 1 :(得分:1)

原来这是因为在/ system / priv-app中手机上安装了另一个版本的应用程序。删除那个可以防止崩溃。