【发布时间】:2013-02-20 18:58:40
【问题描述】:
我已经开始开发一个非常简单的 Android 应用程序,它由三个部分组成:
- Java 应用程序本身
- 一个预构建的共享库(我们称之为
libfoo) - 另一个使用预建库的共享库(我们称之为
libfoowrapper)
文件系统如下所示:
jni
Android.mk
libfoo.so
foowrapper.c
Android.mk 文件包含以下内容:
LOCAL_PATH := $(call my-dir)
#==============================
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
#=========================
include $(CLEAR_VARS)
LOCAL_MODULE := foowrapper
LOCAL_SRC_FILES := foowrapper.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
当我在 Eclipse 中构建应用程序时,一切似乎都运行良好 - 没有报告错误。但是,当我将应用程序上传到我的 Samsung Discover(运行 Android 4.0.4)时,我在日志中收到以下错误:
03-05 21:20:27.859: E/AndroidRuntime(20324): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]: 102 could not load needed library 'libfoo.so.0' for 'libfoowrapper.so' (load_library[1091]: Library 'libfoo.so.0' not found)
为什么 Dalvik 寻找的是 .so.0 文件而不是 .so 文件?我需要对我的应用进行哪些更改才能消除此错误?
【问题讨论】:
-
您能复制一下您在 Java 端加载库的方式吗?您需要以正确的顺序在 Java 的静态块中执行 System.loadLibrary("foo") 和 System.loadLibrary("foowrapper")。此外,您是否在其他设备上尝试过?
-
听起来
libfoowrapper.so引用了libfoo.so.0。检查libfoowrapper.so的链接对象。
标签: android java-native-interface dalvik android-library shared-libraries