iOS 6.1dynamic库build立和链接

我正在尝试为iOS创build一个dynamic库并在运行时加载它。 看了这个问题和这个答案后 ,我一直在使用iOSOpenDev并在我的iPhone上部署所有东西。 dylib的xCode项目叫做KDylibTwo,我修改的文件是:

KDylibTwo.h

#import <Foundation/Foundation.h> @interface KDylibTwo : NSObject -(void)run; @end 

KDylibTwo.m

 #import "KDylibTwo.h" @implementation KDylibTwo -(id)init { if ((self = [super init])) { } return self; } -(void)run{ NSLog(@"KDylibTwo loadded."); } @end 

为了testing我的库是否工作,在构build分析之后(iOSOpenDev在iPhone上部署它),我可以在我的设备上find它存储在/usr/lib/libKDylibTwo.dylib并构build一个调整(再次使用iOSOpenDev) ,钩住SpringBoard如下:

 #include <dlfcn.h> %hook SBApplicationIcon -(void)launch{ NSLog(@"\n\n\n\n\n\n\nSBHook For libKDylibTwo.dylib"); void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW); if(dylibLink == NULL) { NSLog(@"Loading failed."); } else { NSLog(@"Dylib loaded."); void (*function)(void); *(void **)(&function) = dlsym(dylibLink, "run"); if (function) { NSLog(@"Function found."); (*function)(); } else { NSLog(@"Function NOT found"); } } NSLog(@"End of code"); %log; %orig; } %end 

在设备上安装调整并点击一个图标(会触发挂钩代码)后,Console输出如下所示:

 Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: SBHook For libKDylibTwo.dylib Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: Dylib loaded. Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: Function NOT found Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: End of code Aug 28 13:03:35 Pudge SpringBoard[18254] <Warning>: -[<SBApplicationIcon: 0x1d5008c0> launch] 

我的问题是我做错了什么,图书馆的function没有被调用或执行! 我想我应该澄清,我只是谈论越狱的设备,而不是App Store的开发,所以请不要继续发布,它不能做!

先谢谢你,
帕纳约蒂斯。

Victor Ronin指出,“dlsym”是C符号。 要从运行时链接的dylib中获取Objective-C类,可以使用objc运行时函数。 在你的情况下:

 void* dylibLink = dlopen("/usr/lib/libKDylibTwo.dylib", RTLD_NOW); id KDylibTwo = [[objc_getClass("KDylibTwo") alloc] init]; [KDylibTwo run]; 

第一行是在运行时链接你的库。 这是为了使用它内部的代码所必需的。

第二行创build类KDylibTwo实例。 objc_getClass函数返回类对象,您可以稍后使用它创build此类的实例,就像使用任何Objective-C类一样 – 使用allocinit方法。 一旦你用objc_getClass获得类对象,你可以像任何事情一样与他一起工作。 在这一点上,你可以忘记你在运行时dynamic链接你的库。

第三行是调用run方法。 正如你所看到的,这是正常的Objective-C语法。 因为您在运行时链接了库,所以没有任何更改。 你可以调用任何你想要的方法。

我从来没有用过dlsym来得到一个指向客观的c方法的指针(我相信通过dlsym调用客观的c方法是不可能的,但是我可能是错的)。

但是,dlsym的第二个参数应该是符号名称的最重要的信息位。

符号名称“run”只能用于C函数。 就像是:

 EXPORT void run() { NSLog(@"Run"); } 

对象C方法有更复杂的符号名称,正如我所说,我不确定是否可以传递给dlsym。