如何修复Android 6中错误的DT_NEEDED位置

时间:2016-09-23 10:12:18

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

我有一个预建的库( 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变更(https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html)中找到了

  

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

因此,问题是DT_NEEDED条目位置不正确, myprogram 在我的本地构建计算机路径中加载 libprebuilt.so 。我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:0)

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

tl; dr,当libprebuilt.so构建时,需要传递ldflag -soname libprebuilt.so,但它不是。