Dalvik正在寻找扩展名为“.0”的.so文件 - 为什么?

时间:2013-03-06 05:29:51

标签: android java-native-interface dalvik android-library shared-libraries

我已经开始开发一个非常简单的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文件?我需要对我的应用程序做出哪些更改才能摆脱此错误?

1 个答案:

答案 0 :(得分:4)

至少在Linux世界中,每个共享库都有一个名为soname的特殊名称。 soname具有前缀lib,库的名称,短语.so,后跟一个句点和一个版本号,只要界面发生变化就会递增(作为特殊例外,最低级别) C库不以lib开头。完全限定的soname包含它所在目录的前缀;在工作系统上,完全限定的soname只是共享库real name的符号链接。

每个共享库也有一个real name,它是包含实际库代码的文件名。真实姓名为soname添加了一个句号,一个次要号码,另一个句号和版本号。最后一个期间和版本号是可选的。次要编号和版本号通过让您确切知道库的安装版本来支持配置控制。请注意,这些数字可能与用于在文档中描述库的数字不同,尽管这确实使事情变得更容易。

参考:Linux Standard Base

修改 这似乎不是一个不常见的问题,没有看到任何真正的解决方案,但也许这会让你开始找到适合你的东西。

使用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