Android:动态加载共享库

标签 android c linux android-ndk shared-libraries

我有 2 个共享库:lib1.solib2.so

lib1.so 包含一些在 lib2.so 中定义的函数。我从 C 程序中使用以下调用加载 lib1.so:

dlopen( "lib1.so", RTLD_NOW );

这两个库都位于当前目录中。我的程序可以在桌面 Linux(Ubuntu、Debian)下运行,但不能在 Android 下运行。在 Android 下,dlopen 返回错误并退出。我尝试设置:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

但这没有帮助。

我很困惑,为什么这段代码在 Android 下不起作用。我找不到关于 Android 动态链接器的任何好的文档。所以,我无法解释为什么它不起作用。

详细信息:

  1. 采用 Linux 内核 2.6.35 armv7l 的 Android
  2. objdump 显示 lib1.so 需要 libc.so 和 lib2.so
  3. objdump 显示 lib2.so 只需要 libc.so

最佳答案

好的。我刚刚找到了解决方案。将 -lgcc 添加到 lib1.so 的链接器选项已经解决了这个问题。看起来编译器已经自动生成了一些对 libgcc 中特殊内置函数的调用。它还需要 -lc,因为编译器还会自动生成对 memcpy 的特殊调用。

关于Android:动态加载共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238867/

相关文章:

java - C服务器未接收java/android客户端消息

c++ - Linux - 哪些资源需要提升权限的 C/C++ 编程?

linux - 在单核CPU中,IRQ处理程序可以再次被相同的IRQ中断

android - Cardview 设置背景颜色

c - "Simplify"到一行

java - 有没有办法用软键盘将RecyclerView向上推? (聊天)

在 C 中编写多个管道

python - 如何在命令行上调用 python 脚本,就像调用普通 shell 命令(例如 cp)一样?

Android - Fragment 中的 GlSurfaceView 同时运行两次

android - 如何使 SurfaceView 大于屏幕?