我有一个预建的库( 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 。我该怎么做才能解决它?
答案 0 :(得分:0)
libprebuilt.so
来自哪里?这是https://github.com/android-ndk/ndk/issues/177
tl; dr,当libprebuilt.so
构建时,需要传递ldflag -soname libprebuilt.so
,但它不是。