2016-07-26 5 views
0

Мне нужно использовать kIOSurfaceWidth в моем коде для захвата снимка экрана, но для Apple удалил PrivateFrameworks из iOS 9.3, поэтому я должен загружать IOSurface.frameworks динамически во время выполнения. Я использую код, как показано ниже, но возвращаю не null его после dlsym, но когда я пытаюсь установить NSLog значение kIOSurfaceWidth, он сработает. Может ли кто-нибудь мне помочь?Что не так с моим кодом для динамического получения констант с dlsym в jailbroken iOS?

static CFStringRef _kIOSurfaceWidth; 

static void load() 
{ 
    void* handle = dlopen("/System/Library/PrivateFrameworks/IOSurface.framework/IOSurface", RTLD_LAZY); 

    _kIOSurfaceWidth = dlsym(RTLD_DEFAULT, "kIOSurfaceWidth"); 
    if (!_kIOSurfaceWidth) LOG_GENERAL(@">>>>>>>> _kIOSurfaceWidth is NULL"); 
    else NSLOG(@"_kIOSurfaceWidth is %@", (NSString *)CFBridgingRelease(_kIOSurfaceWidth)); 
} 

ответ

1

dlsym() дает вам адрес символа, а не его значение. Измените свой код так:

static CFStringRef *_kIOSurfaceWidth; 

static void load() 
{ 
    void* handle = dlopen("/System/Library/PrivateFrameworks/IOSurface.framework/IOSurface", RTLD_LAZY); 

    _kIOSurfaceWidth = dlsym(RTLD_DEFAULT, "kIOSurfaceWidth"); 
    if (!_kIOSurfaceWidth) LOG_GENERAL(@">>>>>>>> _kIOSurfaceWidth is NULL"); 
    else NSLog(@"*_kIOSurfaceWidth is %@", *_kIOSurfaceWidth); 
} 

У вас также были другие проблемы. В строке вашего журнала использовалась kIOSurfaceWidth без лидирующего подчеркивания (_), поэтому она не имела в виду вашу переменную.

Вы звонили CFBridgingRelease(), что не подходит, если у вас нет ссылки на право собственности. Это подходит только в случае, когда вы имеете право использовать CFRelease(), поэтому его назвали аналогичным образом. Не должно быть необходимости делать листинг, мостик или иначе, просто чтобы передать ссылку на строку в качестве параметра на NSLog().

 Смежные вопросы

  • Нет связанных вопросов^_^