Dalvik正在寻找扩展名为“.0”的.so文件
我已经开始开发一个非常简单的Android应用程序,它由三部分组成:
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
文件? 我需要对我的应用程序进行哪些更改才能摆脱此错误?
至少在Linux世界中,每个共享库都有一个名为soname
的特殊名称。 soname具有前缀lib
,库名称,短语.so
,后跟句点和版本号,每当接口发生更改时,版本号都会递增(作为特殊例外,最低级C库不以lib
)。 完全合格的soname包含它所在目录的前缀; 在一个工作系统上,完全合格的soname只是共享图书馆real name
的象征性链接。
每个共享库也有一个real name
,它是包含实际库代码的文件名。 真名为soname添加了一个时期,一个次要数字,另一个时期以及发行版本号。 上一期和版本号是可选的。 次要编号和版本号通过让您确切知道安装了哪个版本的库来支持配置控制。 请注意,这些数字可能与文档中用于描述库的数字不同,尽管这样做可以让事情变得更简单。
参考:Linux标准库
编辑:看来这不是一个不常见的问题,还没有看到任何真正的解决方案,但也许这会让你开始找到适合你的东西。
使用PREBUILT_SHARED_LIBRARY时出现LOCAL_SRC_FILES问题https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k
为android创建非版本化共享库http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/
未找到图书馆'libproj.so.0'https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88
链接地址: http://www.djcxy.com/p/69765.html