我已经开始开发一个非常简单的 Android 应用程序,它由三部分组成:
- Java应用程序本身
- 一个预先构建的共享库(我们将其称为
libfoo
)
- 另一个使用预构建库的共享库(我们将其称为
libfoowrapper
)
文件系统看起来像这样:
jni
Android.mk
libfoo.so
foowrapper.c
The 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 标准库 http://refspecs.linuxfoundation.org/lsb.shtml
Edit:看来这不是一个罕见的问题,还没有看到任何真正的解决方案,但这也许会让您开始找到适合您的东西。
使用 PREBUILT_SHARED_LIBRARY 时出现 LOCAL_SRC_FILES 问题https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k https://groups.google.com/forum/#!topic/android-ndk/_UhNpRJlA1k
为 android 创建非版本共享库http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-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 https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ai3tu0XXs88
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)