iPhone调用MAC OS X上C/C++写的.dylib问题(二)

Author 正正 Date 2011.03.02 10:19:00   转载请注明出处 正正博客 http://www.2009fly.com

最近有一个项目是需要在Android上和iOS上同时运行,然而Android上官方提倡的是Java来写应用,iOS上需要用Objective-C来书写,然而我们并不想同时维护两个代码,考虑跨平台和通用性,我们决定要用C来写底层,然后给客户提供高层的接口。

目前有一个难题是:怎样用OC(Objective-C)去调用C写的.dylib库?用工具链,未免太麻烦,而且只能在真机上测试(参考资料1【iOS 的模拟器不同于Android,Android类似一个虚拟机,实质上就是一个虚拟机,模拟的是真机上的运行环境。而iOS只是一个软件的模拟器,并不是 一个真机的运行环境!iOS模拟器上运行的是x86机器,而iPhone真机上是ARM机器码;Android上都是ARM架构的机器码】。于是我打算用 MAC工程中的dylib来写程序,需要注意的是:我们的程序只是prue C程序,不会调用framework框架里边的内容,如果你的程序需要调用framework里面的类库的话,请不要建立MAC的dylib工程来如此操 作,目前的话,估计只能用toolChains(参考资料2)!

然后就是编写程序,编写prue C的BSD C Library工程,省略!

现在看看我们怎么来调用,我们新建立一个iPhone的工程View-based Application。然后再工程右边的Classes添加我们导出函数的头文件,在Frameworks添加我们的动态链接库.dylib文件。现在 我们编写一个函数来调用我们动态库中的函数,编译、链接没问题,但是运行时候—–》出错了!提示/usr/local/lib /libHelloC.dylib错误,呵呵,没关系,这是因为我们的可执行程序HelloWorld找不到其调用的libHelloC.dylib,你 可以用otool工具:

$otool –L HelloWorld

去查看其依赖的包位置,发现在/usr/local/lib/libHelloC.dylib中,你可以把你生成的dylib文件拷贝到HelloWorld.app同一个目录中,这样子程序自己回去找dylib!

第二个解决方案是你可以借助于install_name_tool工具:$ install_name_tool -change /usr/local/lib/libHelloC.dylib /Users/zzc/Desktop/HelloC/build/Debug/libHelloC.dylib HelloWorld

将其定位到你的libHelloC.dylib生成的目录,这样子便于调试,要发布到真机上,请定位到你要定位的位置!其实,最简单的方式是你自己放在自己的可执行文件下面,这样子更简单写!【在真机上我没有测试,最后几句话只是臆测!】

我们再用otool看看:

$otool -L HelloWorld

HelloWorld:

/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.49.0)

/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1400.0.0)

/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0)

/Users/zzc/Desktop/HelloC/build/Debug/libHelloC.dylib (compatibility version 1.0.0, current version 1.0.0)

/usr/lib/libSystem.dylib (compatibility version 1.0.0, current version 125.0.0)

/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 550.52.0)

/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)

还有一个上上篇关于前一篇博文的,libSystem.dylib 是libSystem.B.dylib的一个软链接(ln –l ),这个库是c的标准库!

上面所有的内容参考率参考资料3

参考资料:

1、 IPhone 开发环境搭建之失败的第一步

http://www.2009fly.com/index/a/yidongkaifa/iPhone/rumen/iPhonegaoji/2011/0303/688.html

2、 在2009fly.COM搜索toolchain的参考结果

http://www.2009fly.com/index/plus/search.php?domains=www.2009fly.com&kwtype=0&q=toolchain&searchtype=titlekeyword&client=pub-9280232748837488&forid=1&ie=UTF-8&oe=UTF-8&safe=active&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23336699%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3A336699%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BFORID%3A1&hl=zh-CN

3、 XCode、Cocoa开发中使用第三方dylib的方法

====================================================================

版权所有,欢迎转载,请在转载前注明原文出处:正正博客 http://www.2009fly.com

尊重别人的劳动成果也就是尊重自己!

推荐:2009FLY文摘|正正博客

====================================================================

posted @ 2011-03-27 12:38  zzc1986  阅读(1381)  评论(0编辑  收藏  举报