在C ++程序中如何在动态库(.so)中调用C ++类的构造函数

时间:2015-08-06 06:07:48

标签: c++ constructor shared-libraries

我可以在动态库(.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;

}

2 个答案:

答案 0 :(得分:3)

无法手动/直接调用构造函数。所以你必须在共享对象中创建一个如下所示的对象,

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()打开共享对象时,将调用构造函数。

希望这有助于解决您的问题。

答案 1 :(得分:0)

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

MyClass MyInstance(param);

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