android - Android ndk 上的 dlopen

标签 android android-ndk dlopen

我制作了一个 C++ 主应用程序,它加载了一个也是我制作的 so 库。 两个源共享一个公共(public) header (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->behaviour = 2;
  4. 收到 SIGSEGV:段错误,因为 gpTestFlags 为 NULL

由于某种原因,似乎在库中看不到 gpTestFlags 实例。 同样的事情也发生在我拥有的其他静态类上,在主应用程序上配置的值在库中看不到。

据我所知,该库似乎为这些声明管理了一个完全不同的内存空间,就像它们被复制一样。

最佳答案

这是 dlopen() 工作的预期方式。

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

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

关于android - Android ndk 上的 dlopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20641730/

相关文章:

android - 如何让用户一次只能从一台设备登录

android - Fire TV/Fire OS 的 Google 登录

java - Android Parse JSON 卡在获取任务上

Android Jni : crash in global and local ref variables

ios - 如何从库及其地址列表中进行符号化?

c++ - 无法从共享库中打开共享库,只能从可执行文件中打开

java - 保存裁剪后的图像后为 "Unable to resume activity"- Android

android - 如何在cocos2d-x中使用android ndk检查崩溃日志

Android NDK 应用程序无法达到任何断点

C++ 运行时类型与 Python 模块不匹配?