在iOS中使用dlsym调用函数名称

我不能在iOS中通过名称调用函数吗? 我有一个名为getstring的C函数。 我打电话如下:

 void* handle = dlopen(NULL, RTLD_NOW); if (handle) { fp func = dlsym(handle, "getstring"); if (!func) responseField.text = [NSString stringWithUTF8String:dlerror()]; else { char* tmpStr = func(); responseField.text = [NSString stringWithUTF8String:tmpStr]; } } else { responseField.text = [NSString stringWithUTF8String:dlerror()]; } 

执行此操作时, responseFiled.text被设置为dlsym(...): symbol not found 。 这意味着dlopen作品,但不dlsym 。 我使用nm转储二进制文件中的符号,并看到_getstring存在。 我检查了dlsym的手册 ,它说我不应该给这个名字加下划线。 无论如何,添加它并不能解决问题。 我究竟做错了什么?

在这里我曾经问过类似的问题,在Objective-C中用名字调用函数,然后在Mac上成功地在答案中尝试了它,所以这个问题似乎是iOS所特有的。

我相信问题在于,即使静态链接库,dlopen在iOS上也不受支持。 你应该可以使用

 dlsym(RTLD_SELF, "getstring"); 

因为RTLD_SELF的意思是“开始寻找名为dlsym的图像”。 根据你如何使用dlopen(),它应该完成同样的事情。

实际上我有一些类似于你的情况的成功经验。 我用dlsym(RTLD_MAIN_ONLY, "getstring")来获取函数指针。

请注意,您的getstring符号必须适合于dynamic链接:这可以使用检查

 nm -m <application> 

你的符号必须是external (不是non-external )。

我还不太确定这个程序,以确保符号被标记为external