我制作了一个 C++ 主应用程序,它加载了一个也是我制作的 so 库。 两个源共享一个公共(public) header (TestFlags.h)。 在 TestFlags.h 中,我有一个类和它的指针声明,它旨在对整个应用程序是全局的,即在主应用程序中定义一个实例并在库函数中使用它。
class TestFlags {
public:
TestFlags() : behaviour(1)
{}
int behaviour;
};
extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;
然后为达到指定目标而执行的一系列执行步骤是:
- 主应用程序创建一个新的 TestFlags 实例 ---> gpTestFlags = new TestFlags();
- 主应用程序加载库 ---> dlopen(library.so, RTLD_LAZY|RTLD_GLOBAL)
- 调用驻留在库中的函数,该函数使用先前声明的实例 ---> gpTestFlags->behaviour = 2;
- 收到 SIGSEGV:段错误,因为 gpTestFlags 为 NULL
由于某种原因,似乎在库中看不到 gpTestFlags 实例。 同样的事情也发生在我拥有的其他静态类上,在主应用程序上配置的值在库中看不到。
据我所知,该库似乎为这些声明管理了一个完全不同的内存空间,就像它们被复制一样。
最佳答案
这是 dlopen() 工作的预期方式。
这两个模块有独立的全局符号,称为gpTestFlags。如果您尝试将它们链接在一起,链接器会尖叫重复。
您可以将库中的指针声明为弱指针,或者您可以使用 dlsym() 以编程方式解析链接。
关于android - Android ndk 上的 dlopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20641730/