【问题标题】:How to fix bad DT_NEEDED location in Android 6如何在 Android 6 中修复错误的 DT_NEEDED 位置
【发布时间】:2017-02-01 03:54:54
【问题描述】:

我有一个预构建的库 (libprebuilt.so) 和与该库链接的 C 程序 (myprogram.c)。

我遵循本教程 (https://developer.android.com/ndk/guides/prebuilts.html),它在 Android 5(API 22) 设备上运行良好。

这是我的 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libprebuilt
LOCAL_SRC_FILES := libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)

LOCAL_MODULE := myprogram
LOCAL_SRC_FILES := myprogram.c
LOCAL_SHARED_LIBRARIES := libprebuilt
include $(BUILD_SHARED_LIBRARY)

然后我做了 ndk-build ,并将文件夹 libs 重命名为 jniLibs。

这是我的java程序

try {
  System.loadLibrary("prebuilt");
  System.loadLibrary("myprogram");
} catch (UnsatisfiedLinkError ule) {
  Log.e("Error", ule.getMessage());
}

但是,当我使用 Android 6 设备进行测试时,它不起作用并出现以下错误。

dlopen failed: library "/my/build/machine/obj/local/armeabi/libprebuilt.so" not found

我在 Android 6 Changes (https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html) 中发现

此版本更新了动态链接器的行为。动态链接器现在了解库的 soname 及其路径之间的区别(公共错误 6670),并且现在实现了按 soname 搜索。以前工作的应用程序有错误的 DT_NEEDED 条目(通常是构建机器文件系统上的绝对路径)在加载时可能会失败。

所以,问题在于 DT_NEEDED 条目的位置不正确,并且 myprogram 在我的本地构建机器路径中加载了 libprebuilt.so。我能做些什么来解决它?

【问题讨论】:

    标签: java android android-ndk android-6.0-marshmallow


    【解决方案1】:

    libprebuilt.so 是从哪里来的?这是https://github.com/android-ndk/ndk/issues/177

    tl;dr,在构建 libprebuilt.so 时,需要通过 ldflag -soname libprebuilt.so,但它没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2019-12-15
      • 2017-03-30
      • 2020-06-06
      • 2015-05-19
      • 2019-12-23
      相关资源
      最近更新 更多