【发布时间】:2013-08-09 07:44:37
【问题描述】:
我们在市场上使用我们的应用程序的一些 Android 手机上遇到了java.lang.UnsatisfiedLinkError。
问题描述:
static
{
System.loadLibrary("stlport_shared"); // C++ STL
System.loadLibrary("lib2");
System.loadLibrary("lib3");
}
使用java.lang.UnsatisfiedLinkError 使应用程序在System.loadLibrary() 行中崩溃。
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/app_id-2.apk,libraryPath=/data/app-lib/app_id-2]: findLibrary returned null
解决方法
我们开始对所有安装运行一些自定义诊断,以检查是否每个库都解压到 /data/data/app_id/lib 文件夹中。
PackageManager m = context.getPackageManager();
String s = context.getPackageName();
PackageInfo p;
p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;
File appDir = new File(s);
long freeSpace = appDir.getFreeSpace();
File[] appDirList = appDir.listFiles();
int numberOfLibFiles = 0;
boolean subFilesLarger0 = true;
for (int i = 0; i < appDirList.length; i++) {
if(appDirList[i].getName().startsWith("lib")) {
File[] subFile = appDirList[i].listFiles(FileFilters.FilterDirs);
numberOfLibFiles = subFile.length;
for (int j = 0; j < subFile.length; j++) {
if(subFile[j].length() <= 0) {
subFilesLarger0 = false;
break;
}
}
}
}
在我们拥有numberOfLibFiles == 3 和subFilesLarger0 == true 的每部测试手机上。我们想测试是否所有库都正确解包并且大于 0 字节。此外,我们正在查看freeSpace 以查看有多少可用磁盘空间。 freeSpace 与您可以在屏幕底部的设置 --> 应用程序中找到的内存量相匹配。这种方法背后的想法是,当磁盘上没有足够的可用空间时,安装程序可能会在解压 APK 时遇到问题。
真实世界场景
查看诊断信息,有些设备确实没有在/data/data/app_id/lib 文件夹中拥有全部 3 个库,但有足够的可用空间。我想知道为什么错误消息正在寻找/data/app-lib/app_id-2。我们所有的手机都将它们的库存储在/data/data/app_id/lib。 System.loadLibrary() 是否应该在安装和加载库时使用一致的路径?我如何知道操作系统在哪里寻找库?
问题
有人在安装本机库时遇到问题吗?哪些变通方法取得了成功?有没有在不存在时通过互联网下载本机库并手动存储它们的经验?首先可能导致问题的原因是什么?
编辑
我现在也有一个用户在应用程序更新后遇到了这个问题。以前的版本在他的手机上运行良好,更新后本地库似乎丢失了。手动复制库似乎也会造成麻烦。他在 android 4.x 上使用没有自定义 ROM 的非 root 手机。
编辑 2 - 解决方案
在这个问题上花费了 2 年时间。我们想出了一个对我们现在很有效的解决方案。我们开源了:https://github.com/KeepSafe/ReLinker
【问题讨论】:
-
您是否知道它无法在哪些设备上运行?是否有可能您只构建 arm,而不是 x86?
-
是的,我们知道这些设备。有一些三星 Galaxy SII 和 LG 手机。所有崩溃的手机都是ARM手机。我们不是为 x86 构建的。
-
您的意思是系统映像中的“stlport_shared”还是您直接与您的应用程序捆绑的东西?系统提供的只是“stlport”,尽管您也可以使用 stlport_static 编译/链接。此外,故障设备是哪些操作系统版本(Gingerbread 或更新的版本)?
-
我们将 stl_port 与我们自己的应用一起发布。该问题出现在所有 android 版本中。
-
您可以尝试链接到 gnustl_shared。我有几个与 stlport 相关的设备特定问题。请注意,GPL v3 对此库有一个例外,允许您链接专有软件。
标签: android android-ndk java-native-interface native unsatisfiedlinkerror