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