Objective C如何在App内部调用外部dylib 和 framwork
因为接触的项目经常需要用到别人写的framework和dylib,所以今天要写的东西是如何在App内部实现调用外部动态库文件,如果刚好你也在研究这个,也希望可以对你有帮助喔。
PS:毕竟我是自学小白出身,好多东西都是自己摸索,有不对的地方还请一笑而过. 😁
App调用动态库方法:
- 方法一:通过项目中导入header+link 动态库,创建动态库中的类对象然后使用public 方法
- 方法二:通过dlopen或NSBundle去外部加载指定动态库中类对象,然后使用其方法
方法一的模式比较单纯好理解,就不做介绍了。这里记录的是方法二,因为觉得方法二比较有意思。
下面开始,go go go.
Dylib
首先创建一个dylib-->(dylibTry),需要定义相关的类的实现,这里我为了demo演示只单纯的写了一个echo方法(sayHello),你可以关联跟多类,将你最终的需求实现导入一个对外的类header中,然后通过dlopen 加载资源,指定call 该类.
void *libHandle;
char *error;
libHandle = NULL;
libHandle = dlopen(LIB_CACULATE_PATH, RTLD_NOW);
if (libHandle == NULL) {
error = dlerror();
NSLog(@"dlopen error: %s", error);
} else {
NSLog(@"dlopen load dylib success.");
}
Class PublicAPIClass = NSClassFromString(@"dylibTry");
if (!PublicAPIClass) {
NSLog(@"Unable to load class");
return 0;
}
NSObject *publicAPIObject = [PublicAPIClass new];
[publicAPIObject performSelector:@selector(sayHello)];
结果如下:
2020-03-18 10:23:59.508749+0800 runDylibTest[68522:655761] dlopen load dylib success.
2020-03-18 10:23:59.509079+0800 runDylibTest[68522:655761] Enter Self Init
2020-03-18 10:23:59.509182+0800 runDylibTest[68522:655761] Hello,萧蔷ink
直接创建object 然后去call class method是不是很直接喔
Framwork
一样,你需要创建一个framwork,定义内部的相关类实现,这里我也创建了一个person的类,一样的echo 方法,只不过这里用到的是NSBundle去load资源。
NSError *error = nil;
NSBundle *frameworkBundle = [NSBundle bundleWithPath:bundlePath];
if (frameworkBundle && [frameworkBundle loadAndReturnError:&error]) {
NSLog(@"Load framework successfully");
}else {
NSLog(@"Failed to load framework with err: %@",error);
return -1;
}
Class PublicAPIClass = NSClassFromString(@"Person");
if (!PublicAPIClass) {
NSLog(@"Unable to load class");
return 0;
}
NSObject *publicAPIObject = [PublicAPIClass new];
[publicAPIObject performSelector:@selector(sayHello)];
结果如下:
2020-03-18 10:32:50.610453+0800 runDylibTest[69866:667880] Load framework successfully
2020-03-18 10:32:50.610858+0800 runDylibTest[69866:667880] Enter Self Init
2020-03-18 10:32:50.610935+0800 runDylibTest[69866:667880] Hello,萧蔷ink1
上面就是2种方式加载调用外部动态库文件,到这里,我还想到了一些问题,OC是怎么做到这个资源分配实现的,以后有机会我会去探索了解这些内部的机制,对于小白的我来说,还是先学会走路吧。 : - )
Knowledge, like candlelight, can illuminate a person and countless people.