dlopen on Android ndk

时间:2013-12-17 18:17:15

标签: android android-ndk dlopen

我制作了一个c ++主要的应用程序,它加载了一个由我制作的库。 两个源共享一个公共头(TestFlags.h)。 在TestFlags.h中,我有一个类和一个指针声明,它是整个应用程序的全局,它在主应用程序中定义一个实例并在库函数中使用它。

class TestFlags {
public:
    TestFlags() : behaviour(1)
        {}
    int behaviour;
};

extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;

然后达到命名目标的一系列执行步骤是:

  1. 主应用程序创建一个新的TestFlags实例---> gpTestFlags = new TestFlags();
  2. 主要应用程序加载库---> dlopen(library.so,RTLD_LAZY | RTLD_GLOBAL)
  3. 调用驻留在库中的函数,该函数使用先前声明的实例---> gpTestFlags-> behavior = 2;
  4. 收到SIGSEGV:分段错误,因为gpTestFlags为NULL
  5. 似乎库内的gpTestFlags实例由于某种原因未被看到。 同样的事情也发生在我拥有的其他静态类中,在主应用程序中配置的值在库中没有看到。

    到目前为止,我可以研究一下,这个库似乎为那些声明管理了一个完全不同的内存空间,比如它是否重复。

1 个答案:

答案 0 :(得分:1)

这是dlopen()的预期方式。

这两个模块具有称为 gpTestFlags 的独立全局符号。如果您尝试将它们链接在一起,链接器会尖叫重复。

您可以将库中的指针声明为弱,或者您可以使用dlsym()以编程方式解析链接。