java.lang.UnsatisfiedLinkError在某些设备上崩溃

Xav*_*Gil 5 android android-ndk

我有一个已发布的应用程序报告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工具链编译的,我将它们集成到我nkd-build使用以下Android.mk文件运行的项目中:

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)
Run Code Online (Sandbox Code Playgroud)

该错误正在不同的设备上报告,但目前所有这些都是以下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;
Run Code Online (Sandbox Code Playgroud)

Xav*_*Gil 5

在这种情况下,问题是该库正在使用Android 2.2上不支持的一些C方法

这个链接是发现问题的方法.

诸如pthread_rwlock_init在Android 2.3(源代码)之前未在系统的C库中实现的方法.