加载android库

加载android库,android,android-library,unsatisfiedlinkerror,Android,Android Library,Unsatisfiedlinkerror,我有一个这样加载的库: static { System.loadLibrary("myLibrary"); } 这在大多数设备上都能正常工作。但是,在一台设备上,它会导致stacktrace崩溃: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file

我有一个这样加载的库:

  static {
    System.loadLibrary("myLibrary");
  }
这在大多数设备上都能正常工作。但是,在一台设备上,它会导致stacktrace崩溃:

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)
java.lang.unsatifiedlinkerror:dalvik.system.PathClassLoader[DexPathList[[zip文件”/system/framework/com.google.android.maps.jar],zip文件“/vendor/overlay/myBuild.apk”],nativeLibraryDirectories=[/vendor/lib,/system/lib]]找不到“myLibrary.so”
位于java.lang.Runtime.loadLibrary(Runtime.java:366)
位于java.lang.System.loadLibrary(System.java:989)
在com.sony.foo.bar.(myClass.java:20)
接受的答案促使我尝试将myLibrary的副本添加到一个新的
armeabi-v7
文件夹中,其中原始库位于名为
armeabi
的文件夹中。这解决了撞车问题

我正试图弄明白这一点。这是否意味着崩溃的手机有不同的CPU?CPU标识符应用程序将其标识为与其他应用程序具有相同的类型(制造商、型号)。即使假设撞坏的手机是
armeabi-v7
,投票最多的答案和被接受的答案,让它听起来像
armeabi-v7
手机也应该能够使用
armeabi
文件夹中的库。不是这样吗


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

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

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

APP_ABI := armeabi armeabi-v7a mips x86
ndk build
之后,将在文件夹
libs/armeabi
中生成四种类型的库,
libs/armeabi-v7a
libs/x86
libs/mips
。通过比较
libs/armeabi
libs/armeabi-v7a
中的文件,您会发现它们并不相同。到目前为止,我看不出他们的不同。这两个库的大小略有不同,所以我认为它们之间没有太大的区别

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


如果您确定自己在做什么,请只保留
armeabi
。然后,你可以将你的库放在
assets
目录下,当你的应用程序启动并运行时,你应该从
assets
读取你的库,然后用
System.load()加载
安装应用程序时,除了依靠framework package manager系统将程序库充气到应用程序的数据目录之外,还可以手动操作。

这是由于手机上安装了另一个版本的应用程序,位于/system/priv app中。拆下那一个防止了撞车