Android:动态加载共享库

时间:2013-01-09 15:38:03

标签: android c linux android-ndk shared-libraries

我有2个共享库: lib1.so lib2.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. Android with Linux kernel 2.6.35 armv7l
  2. objdump显示lib1.so需要libc.so和lib2.so
  3. objdump显示lib2.so只需要libc.so

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果dlopen由于某种原因无效,您是否尝试过调用dlerror来找出真正的问题是什么?

答案 2 :(得分:0)

我对你的项目不太确定。 但我认为,最好使用System.loadLibrary从服务加载库。

的System.loadLibrary(lib.so); 在您的情况下,首先加载lib2.so然后只加载lib1.so