使用DLC(Dynamic Loader Compatibility)函数提取iPhone当前运营商信号的强度

 

今天作了一个尝试,想要得到iPhone当前的运营商信号的强度值。

在此过程中看到很多人用到了加载动态库的方法来,现在我将总结下来:

0. 由于我们DLC函数声明在/usr/include/dlfcn.h这个文件中,所以我们首先要将它引入:#include <dlfcn.h>

1. 就像iOS平台上的嵌入式数据库sqlite一样,动态库也要先打开:

  void *dylibHandle = dlopen("/System/Library/Framework/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);

使用函数:void *dlopen(const char *path, int mode);

参数含义:

    path: 我们所要打开的动态库的绝对路径;

    mode: 打开模式

         RTLD_LAZY  (default)  每个外部的符号引用将在它第一次被使用时进行绑定。(暂缓决定,等有需要时再解出符号 )
         RTLD_NOW    外部符号引用将被立即绑定。(立即决定,返回前解除所有未决定的符号)
         RTLD_LOCAL 
           RTLD_GLOBAL

返回值:

    失败:NULL

    成功:一个动态库引用句柄,一般用来调用dlsym和dlclose这两个函数。

2. 获得外部符号的地址:

  首先我们申明一个函数指针,然后包符号地址付给我们声明的指针。

  int (*getSignalStrength)(void);

  getSignalStrength = dlsym(dylibHandle, "CTGetSignalStrength");

*注:获得本机号码

* NSString (*getPhoneNumber)(void);

* getPhoneNumber = dlsym(dylibHandle, "CTSettingCopyMyPhoneNumber");

 

使用函数:dlsym(void *handle, const char *symbol);

参数含义:

     handle:由dlopen函数返回的句柄

     symbol:是要求获取的函数的名称

返回值:

    失败:NULL

    成功:指向函数的地址,供调用使用

3. 获取信号强度:

    这个强度使用一个整型数值表示的。

    int signalStrength = 0;

    signalStrength = getSignalStrength();

4. 关闭已打开的动态库:

  dlclose(dylibHandle);

使用函数:int dlclose(void *handle);

参数含义:

     handle:由dlopen函数返回的句柄

返回值:

    失败:非0

    成功:0

 

测试设备:iPhone 3GS

设备系统:iOS 4.3.3

设备状态:已越狱

测试结果:Perfect!

posted @ 2011-11-09 17:34  Ray_Zhang  阅读(548)  评论(0编辑  收藏  举报