【问题标题】:In C++ program how to call a constructor of C++ class which in dynamic library(.so)在C++程序中如何调用动态库(.so)中的C++类的构造函数
【发布时间】:2015-08-06 06:07:47
【问题描述】:

我可以调用动态库(.so)中C++类的常用函数,但不知道如何调用动态库(.so)中C++类的构造函数。

JNIEXPORT jint JNICALL Java_com_example_hellobreakdd_MainActivity_helloBreak (JNIEnv *, jobject){

void *handle;

double (*cosine)(double);

char *error;

handle = dlopen("libtest.so", RTLD_NOW);

if (!handle) {
    __android_log_print(ANDROID_LOG_ERROR, "start", dlerror());
}

*(void **) (&cosine) = dlsym(handle, "Add");

printf("%f\n", (*cosine)(2.0));

dlclose(handle);

return 1;

}

【问题讨论】:

  • 首先你需要一个class ...
  • 那么,我需要做什么?任何帮助都会非常重要。

标签: c++ constructor shared-libraries


【解决方案1】:

不能手动/直接调用构造函数。因此,您必须在共享对象中创建一个对象,如下所示,

class shape {
 public:
    void draw();
};
extern "C" {
 Shape *maker(){
  return new Shape();
}

在这种情况下,您需要一个类形状的头文件来从 void 指针进行类型转换。说,

void *mkr = dlsym(hndl, "maker");  // get maker method symbol 
shape *my_shape = static_cast<shape *()>(mkr)(); //get the shape object

如果您不想要基于 C 的函数调用,那么您必须找到损坏的名称并使用它来调用 maker() 函数并避免“extern c”。在这种情况下,您可以使用 nm 命令获取 .so 文件中的符号。

改为在共享对象中创建一个全局对象,并使用上述方法获取对象实例。在这种情况下,当您使用 dlopen() 打开共享对象时,将调用构造函数。

希望这对您的问题有所帮助。

【讨论】:

    【解决方案2】:

    当你初始化该类的实例并因此创建一个对象时,会调用该类的构造函数,

    MyClass MyInstance(param);
    

    假设MyClass是一个类,param是要传递给构造函数的参数,这会调用构造函数或MyClass

    【讨论】:

      【解决方案3】:

      如果修改 .so 不是一个选项。我们可以从.so中手动创建一个c++类的对象,相应地调用new和constructor函数。

      通常,编译器会做这种工作,但我们可以通过一些内联汇编代码来完成。

      这是一个在 x86 代码中创建虚拟类对象的示例:

      asm volatile {
          "mov $1, %%edi\n"
          "callq *%2\n"
          "mov %%rax, %%rbx\n"
          "mov %%rbx, %%rdi\n"
          "callq *%1\n"
          "mov %%rbx, %0\n"
          : =m "my_pointer"
          : m "dummy_new", m "dummy_constructor"
          : "%edi", "%rax", "%rbx", "%rdi"
      }
      

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2020-09-10
        • 2018-05-25
        • 2012-09-28
        相关资源
        最近更新 更多