一些设备上出现java.lang.UnsatisfiedLinkError崩溃问题

5
我有一个发布的应用程序,在某些设备上报告了java.lang.UnsatisfiedLinkError崩溃。更准确地说,应用程序在启动时崩溃,并显示以下日志消息:Caused by: java.lang.UnsatisfiedLinkError: Couldn't load qcc: findLibrary returned null。实际崩溃是在 System.loadLibrary("qcc"); 中,因此应用程序肯定找不到库。
问题在于我自己无法复制该问题。实际上,同一apk可以在许多不同的设备和版本上完美运行。
该应用程序使用由第三方编写和编译的两个C库。他们使用了 arm-linux-androideabi-4.6 工具链进行编译,并且我正在通过以下 Android.mk 文件运行nkd-build来集成它们:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libqcc
LOCAL_SRC_FILES := qcc/libqcc.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libqpe
LOCAL_SRC_FILES := qpe/libqpe.so
include $(PREBUILT_SHARED_LIBRARY)

错误报告来自不同的设备,但目前所有设备均为以下 Android 版本之一:2.2、2.2.1 或 2.2.2。
我认为这可能是架构问题或安装过程中的奇怪问题。
有人知道问题可能是什么吗?
更新: 我意识到我可以在 Android 2.2 模拟器中重现这个问题。这是我从 logcat 中收集到的额外信息。
11:14:59.962 I/dalvikvm(  287): Unable to dlopen(/data/data/.../lib/libqcc.so): Cannot load library: link_image[1995]: failed to link libqcc.so
11:14:59.962 W/dalvikvm(  287): Exception Ljava/lang/UnsatisfiedLinkError;

可能是armeabi与armeabi-v7a的问题。为了保险起见,请同时构建两个版本。 - Seva Alekseyev
Seva Alekseyev是正确的,也许你可以尝试创建一个Application.mk文件(如果你还没有它),并加入以下这行代码: APP_ABI := armeabi armeabi-v7a - Esparver
1个回答

5
在这种情况下,问题在于该库使用了一些Android 2.2不支持的C方法。
这个链接是发现问题的方式。
pthread_rwlock_init这样的方法直到Android 2.3的系统C库才实现(来源)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接