通過dlopen使用動態(tài)庫

動態(tài)庫制作

dlopen 動態(tài)加載Frameworks

使用dlopen和dlsym方法動態(tài)加載庫和調(diào)用函數(shù)

動態(tài)庫使用

鏈接器:符號是怎么綁定到地址上的

問題:在APP運行時通過dlopendlsym鏈接加載bundle里面的動態(tài)庫

dlopen:以指定模式打開指定的動態(tài)鏈接庫文件,并返回一個句柄給調(diào)用進程。

void * dlopen( const char * pathname, int mode ); 
mode:(可多選的)
// 表示動態(tài)庫中的symbol什么時候被加載
RTLD_LAZY 暫緩決定,等有需要的時候再解析符號
RTLD_NOW 立即決定,返回前解除所有未決定的符號
// 表示symbol的可見性
RTLD_GLOBLE 允許導出符號
RTLD_LOCAL

使用系統(tǒng)framework

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"];
void *lib = dlopen("/System/Library/Frameworks/AVFoundation.framework/AVFoundation", RTLD_LAZY);
if (lib) {
    Class playerClass = NSClassFromString(@"AVAudioPlayer");
    SEL selector = NSSelectorFromString(@"initWithData:error:");
     _runtime_Player = [[playerClass alloc] performSelector:selector withObject:[NSData dataWithContentsOfFile:resourcePath] withObject:nil];
    selector = NSSelectorFromString(@"play");
    [_runtime_Player performSelector:selector];
    NSLog(@"動態(tài)加載播放");
    dlclose(lib);
}

使用第三方動態(tài)庫

使用動態(tài)庫有兩種方式,一種是將動態(tài)庫添加未依賴庫,這樣會在工程啟動時加載動態(tài)庫,一種是使用dlopen在運行時加載動態(tài)庫,這兩種方式的區(qū)別在于加載動態(tài)庫的時機。

在iOS上如果使用了方式二,是不能上架到App Store的。

1、將動態(tài)庫的頭文件添加到項目中

2、編譯工程文件。生成APP的包文件,在項目Products文件夾下

3、將framework添加到APP的包文件(鼠標右鍵顯示包內(nèi)容)中

這樣基本就可以運行成功了

// 1.獲取動態(tài)庫路徑
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"MangoSDK" ofType:nil];
// 2.打開動態(tài)庫
void *lib = dlopen([resourcePath UTF8String], RTLD_LAZY);
if (lib == NULL) {
    // 打開動態(tài)庫出錯
    fprintf(stderr, "%s", dlerror());
    exit(EXIT_FAILURE);
} else {
    // 獲取類
    Class util = NSClassFromString(@"MGUtils");
    // 獲取方法
    SEL selector = NSSelectorFromString(@"getMessage");
    id obj = [[util alloc] init];
    // 執(zhí)行
    NSString *message = [obj performSelector:selector];
    dlclose(lib);
    return message;
}
return nil;
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗...
    190CM閱讀 4,520評論 0 4
  • 前言 說到動態(tài)庫,就不得不提靜態(tài)庫。靜態(tài)庫可以看做是一個具有特定功能的代碼塊,如果app中引用了靜態(tài)庫,則在編譯時...
    wangzzzzz閱讀 5,454評論 6 13
  • 前言 1.靜態(tài)庫和動態(tài)庫有什么異同? 靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。利用靜態(tài)...
    Ly夢k閱讀 8,742評論 3 18
  • 前面介紹過制作過程,這里不講如何制作動態(tài)庫、靜態(tài)庫。 靜態(tài)庫和動態(tài)庫都是以二進制提供代碼復用的代碼庫。 靜態(tài)庫常見...
    紙簡書生閱讀 23,191評論 10 96
  • 起因 理論功底 動態(tài)庫和靜態(tài)庫 介紹 靜態(tài)庫和動態(tài)庫的區(qū)別 舉個例子, iOS 項目中使用 Embeded Fra...
    leverkusen188閱讀 1,093評論 0 3

友情鏈接更多精彩內(nèi)容