【发布时间】: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