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

标签 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)

错误在不同的设备上报告,但目前所有设备都是以下 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;

最佳答案

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

link是发现问题的方法。

pthread_rwlock_init 等方法直到 Android 2.3 ( source ) 才在系统的 C 库中实现。

关于android - java.lang.UnsatisfiedLinkError 在某些设备上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15207237/

相关文章:

java - 如何设置 Android Studio 以使用原生库?

android - JNI 调用非静态函数段错误

android - ROOM 构造函数在构建时无法匹配

java - 在构建时从 Gradle 设置静态变量

android - 多 dex 的问题

java - FindViewById 在类类型 Service 中?

android - JNI 没有找到我的其他 Activity

android - 应用程序因使用 ANativeWindow API 而崩溃

android - eglGetError() 报告错误成功

android - 如何使用通过通知传递的 Intent 更新 Activity