【问题标题】:Dalvik is looking for .so file with '.0' extension - why?Dalvik 正在寻找扩展名为 '.0' 的 .so 文件 - 为什么?
【发布时间】: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


【解决方案1】:

至少在 Linux 世界中,每个共享库都有一个特殊的名称,称为 soname。 soname 有前缀lib、库的名称、短语.so,后跟一个句点和一个版本号,只要接口发生变化,版本号就会增加(作为一个特殊例外,最低级别的 C 库没有' t 以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

【讨论】:

  • 这确实是我的错,因为没有更好地措辞,但我真正的问题是“我该如何解决这个问题?”我的应用程序不会以当前形式运行。
  • 然后我得到一个错误Android NDK: ERROR:jni/Android.mk:git2-prebuilt: LOCAL_SRC_FILES points to a missing file
  • 感谢您的更新。特别是您提供的第二个链接非常有价值。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 2018-09-23
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多