Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is the function 'dlopen()' private API?

Tags:

I want use function 'dlopen()' to invoke a dynamic library on iOS platform, is the function 'dlopen()' private API?

like image 788
Donald Avatar asked Jun 30 '11 06:06

Donald


People also ask

What is Dlopen?

The dlopen() function shall make an executable object file specified by file available to the calling program.

Why is Dlopen used?

dlopen() The function dlopen() loads the dynamic shared object (shared library) file named by the null-terminated string filename and returns an opaque "handle" for the loaded object.


1 Answers

I've had success using dlopen on iOS for years. In my use case, I use dlopen to load public system frameworks on demand instead of having them loaded on app launch. Works great!

[EDIT] - as of iOS 8, extensions and shared frameworks are prohibited from using dlopen, however the application itself can still use dlopen (and is now documented as being supported for not only Apple frameworks, but custom frameworks too). See the Deploying a Containing App to Older Versions of iOS section in this Apple doc: https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf

[EDIT] - contrived example

#import <dlfcn.h>  void printApplicationState() {     Class UIApplicationClass = NSClassFromString(@"UIApplication");     if (Nil == UIApplicationClass) {         void *handle = dlopen("System/Library/Frameworks/UIKit.framework/UIKit", RTLD_NOW);         if (handle) {             UIApplicationClass = NSClassFromString(@"UIApplication");             assert(UIApplicationClass != Nil);             NSInteger applicationState = [UIApplicationClass applicationState];             printf("app state: %ti\n", applicationState);             if (0 != dlclose(handle)) {                 printf("dlclose failed! %s\n", dlerror());             }         } else {             printf("dlopen failed! %s\n", dlerror());         }     } else {         printf("app state: %ti\n", [UIApplicationClass applicationState]);     } } 
like image 185
NSProgrammer Avatar answered Sep 21 '22 06:09

NSProgrammer