Apple禁止在iPhone中使用动态链接库(Android中可以通过NDK开发,使用JNI技术调用第三方C/C++代码编译的动态链接库libXXX.so),所以要重用代码(第三方库或自己写的C/C++代码库),大致有如下两种方法: 1、将第三方代码库直接加入到使用该代码库的Xcode工程中 1)本人曾做过尝试,将Android产品中底层C代码库移植到iPhone产品中,这些代码库在Android开发时使用NDK技术,用makefile编译的,编译依赖关系比较复杂,直接加入到Xcode工程中编译会有很多错误,解决这些问题实在头大。 2)代码库是Android/IOS共用的,最好还是保持一份代码,如果将这些代码加入到Xcode工程中,自然会加大代码维护成本。 所以,本人认为这种方式实在不可取。 2、使用静态库。
大致有如下两种方式: 1)使用Cocoa Touch Static Library模板 个人认为:这种方式更适合于准备新开发一个C/C++库(比如:准备使用Xcode开发一套纯C/C++代码库用于iOS产品,并且其它平台产品比如Android产品也使用这套代码库)。 如果使用已存在的第三方库代码,用该模板新建一个Static Library工程,然后再将第三方库代码加入到该工程编译,也可能会出现因第三方库代码编译依赖比较负责,而出现很多错误的情况 。 2)使用makefile编译第三方库生成libXXX.a文件(使用makefile来维护代码的编译还是比较方便的),然后在使用该库的工程中引入第三方库的头文件,并将编译好的libXXX.a库加入到Link Binary With Libraries中。 下面演示如何使用第一种方法“Cocoa Touch Static Library模板”这种方式进行静态库的开发。 1、使用Cocoa Touch Static Library模板创建一个静态库工程,命名为:MyLibrary
#import@interface MyMath : NSObject +(double)plus:(double)x andY:(double)y; +(double)minus:(double)x andY:(double)y; +(double)multiply:(double)x andY:(double)y; +(double)divide:(double)x andY:(double)y; @end
MyMath.m如下:
#import "MyMath.h" @implementation MyMath +(double)plus:(double)x andY:(double)y{ return x+y; } +(double)minus:(double)x andY:(double)y{ return x-y; } +(double)multiply:(double)x andY:(double)y{ return x*y; } +(double)divide:(double)x andY:(double)y{ if(y==0){ return 0; }else{ return x/y; } } @end
3、新建头文件NumberUtil.h,源文件NumberUtil.c NumberUtil.h如下:
#ifndef MyLibrary_NumberUtil_h #define MyLibrary_NumberUtil_h double getMax(double x,double y); double getMin(double x,double y); #endif
NumberUtil.c如下:
#include#include "NumberUtil.h" double getMax(double x,double y){ return x>=y?x:y; } double getMin(double x,double y){ return x<=y?x:y; }
现在MyLibrary工程结构如下:
#import "ViewController.h" #import "MyMath.h" #import "NumberUtil.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //测试静态库,纯c代码,NumberUtil.h [self testNumberUtil]; //测试静态库,Object-c代码,MyMath类 [self testMyMath]; } -(void)testNumberUtil{ double x=20; double y= 12; double max = getMax(x, y); double min = getMin(x, y); NSLog(@"max=%.2f,min=%.2f",max,min); } -(void)testMyMath{ double x=12; double y= 21; double plus = [MyMath plus:x andY:y]; double minus = [MyMath minus:x andY:y]; double multiply = [MyMath multiply:x andY:y]; double divide = [MyMath divide:x andY:y]; NSLog(@"plus=%.2f,minus=%.2f,multiply=%.2f,divide=%.2f",plus,minus,multiply,divide); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
9、编译、运行,输出的日志如下: MyLibraryTest[2997:c07] max=20.00,min=12.00 MyLibraryTest[2997:c07] plus=33.00,minus=-9.00,multiply=252.00,divide=0.57 10、将MyLibrary工程加入到MyLibraryTest中(即:上面将MyLibrary拖入到MyLibraryTest中)到底起了什么作用? 据本人的理解最重要的是为了上面第7步的操作,否则第7步中找不到libMyLibrary.a 这样的话,如果能找到libMyLibrary.a的存放位置,并且在第7步中加入该库,完全没必要将MyLibrary工程加入到MyLibraryTest中。 libMyLibrary.a库存放在哪儿? 在MyLibrary工程中选中libMyLibrary.a,点击右键选择“Show in Finder”
,可打开libMyLibrary.a的存放位置: 本人机子上的位置是:/Users/duobianxing/Library/Developer/Xcode/DerivedData/MyLibrary-cetahfcogcfucqchjtmezhvutvsk/Build/Products/Debug-iphoneos(如果用模拟器应该是:Debug-iphonesimulator)
1)将MyLibrary从MyLibraryTest中移除(仅移除引用,不要删除哦) 2)重做第7步操作,点击左下角的Add Othe...,找到上面Debug-iphoneos 下的libMyLibrary.a,加入进来(不要用拷贝方式,如果拷贝进来,一旦生成新的libMyLibrary.a,测试工程中无法自动更新到最新版本)。 11、上面提到本人的libMyLibrary.a库在Debug-iphoneos下(本人用的是真机设备),如果是用模拟器libMyLibrary.a应该在Debug-iphonesimulator下。
用模拟器和用真机设备生成的静态库libMyLibrary.a是一样的吗? 本人刚做库移植的时候,曾想当然地认为是一样的,结果多浪费了一些时间. 1)用于iphonesimulator的静态库是i386架构的 2)用于iphoneos的静态库是arm架构的,常用的arm6 arm7 arm7s 有个命令lipo可以查看库的信息,如下:
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10861715
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员