我已经开始开发一个非常简单的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中构建应用程序时,一切似乎都运行良好——没有报告任何错误。然而,当我将应用程序上传到我的三星发现(运行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
的特殊名称。名称有前缀lib
,库的名称,短语.so
,后面跟着一个句点和版本号,该版本号在接口更改时递增(作为一个特殊的例外,最低级别的C库不以lib
开头)。一个完全限定的文件名作为前缀包括它所在的目录;在一个正常运行的系统上,一个完全限定的名称仅仅是一个指向共享库real name
的符号链接。
每个共享库也有一个real name
,它是包含实际库代码的文件名。实名在名字上加上句号、副号码、另一个句号和发行号。最后周期和版本号可选。次要号和发行号通过让您确切地知道安装的库的哪个版本来支持配置控制。请注意,这些数字可能与文档中用于描述库的数字不同,尽管这确实使事情变得更容易。
参考:Linux Standard Base
编辑:这似乎不是一个罕见的问题,还没有看到任何真正的解决方案,但也许这会让你开始寻找适合你的方法。
使用PREBUILT_SHARED_LIBRARY时LOCAL_SRC_FILES的问题https://groups.google.com/forum/!主题/android-ndk _UhNpRJlA1k
为android创建非版本共享库http://www.opengis.ch/2011/11/23/creating-non-versioned-shared-libraries-for-android/
libproj.so图书馆"。没有找到0https://groups.google.com/forum/?fromgroups= !主题/android-ndk ai3tu0XXs88