【问题标题】:Android ndk and dynamic load library with dlopenAndroid ndk 和带有 dlopen 的动态加载库
【发布时间】:2016-06-02 12:42:37
【问题描述】:

我想从外部文件目录动态加载共享库。

我创建了库并在 linux 上对其进行了测试,它可以工作。 编译:gcc -fPIC -shared -static-libstdc++ -static-libgcc test_lib.cpp constructor.cpp -o test.so

但是当我在 android ndk 中使用它时,我得到运行时错误: dlopen 失败:找不到库“libc.so.6”。

我该如何解决?我用的是模拟器

【问题讨论】:

    标签: android c++ c android-ndk


    【解决方案1】:

    您不能在 android 上使用为普通 linux 构建的库 - 它仍然链接到在 Android 上不可用的共享 libc.so.6。 (您不能静态链接共享库,请参阅例如https://stackoverflow.com/a/6637842/3115956。)

    您需要使用 NDK 编译器针对 Android C 运行时库构建库。

    如果您喜欢冒险,您可以尝试强制它将 C 运行时静态链接到您的库中,方法是使其链接 libc.a 而不是 libc.so,但我不确定这是否会导致其他问题。 (可以在 android 上运行为普通 linux 构建的可执行文件,假设它们是使用 -static 构建的,但我不确定它对共享库的效果如何。)

    【讨论】:

    • 您回答的第一部分很好,但我认为没有理由强制链接 Android C 运行时。当为您的目标平台实际编译库更容易和更安全时,这是一个糟糕的建议。
    • 我不确定我是否理解 - 理想情况下,他应该为他的目标平台构建他的库 - 我同意。当想在 android 上运行它时,可以使用 android NDK 来完成,这将确保它与 android C 运行时而不是 glibc 链接。
    • “你不能在安卓上使用为普通 linux 构建的库 - 它仍然链接到在安卓上不可用的共享 libc.so.6。”但例如 boost 在 ndk 中工作。为什么?
    • 我不确定 boost,或者你指的是它的部分只使用头文件,而不是预编译的 .so,或者 .so 没有链接到 glibc 中的任何东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2021-12-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多