iOS OC 项目集成 C 算法库完整指南一、概述思路与实现方式1.1 核心思路在 iOS 原生 Objective-C 项目中集成 C 算法库核心思路和 Android 的 JNI 类似但实现方式更轻量。我们不需要像 Android 那样通过 JNI 接口层和javac/javah工具生成头文件而是直接利用 Xcode 对Objective-C的原生支持。本质就是给 C 代码套上一层 Objective-C 的壳让 OC 业务层完全感知不到 C 的存在。术语“在 iOS 中我们通过 Objective-C 编写一个 Wrapper 层来封装 C 算法库为上层提供 OC 接口。”最标准的说法是 “Objective-C”这是 Apple 官方术语。最常用的开发语境是 “OC Wrapper”清晰明了。“Bridge/桥接层” 是口语化的概念描述不是标准术语但大家能听懂。绝对不要叫 “iOS JNI”这是外行说法。1.2 三层架构┌─────────────────────────────────────────┐ │ 第 1 层OC 业务层 │ │ (ViewController.m) │ │ 只写 OC 代码不涉及任何 C │ └─────────────────┬───────────────────────┘ │ 调用 OC 接口 ┌─────────────────▼───────────────────────┐ │ 第 2 层OC 桥接层 (关键) │ │ (Bridge.mm) │ │ Objective-C 混编文件 │ │ 翻译OC 方法 → C 方法调用 │ └─────────────────┬───────────────────────┘ │ 持有 C 对象 ┌─────────────────▼───────────────────────┐ │ 第 3 层C 算法层 │ │ (Algorithm.cpp) │ │ 纯 C 实现跨平台可复用 │ └─────────────────────────────────────────┘1.3 关键技术点技术点说明.mm文件Objective-C 源文件同时支持 OC 和 C 语法C 对象管理C 对象需要手动new/deleteARC 不负责类型转换NSString→std::stringNSInteger→int等头文件隔离桥接类的.h不能包含任何 C 代码避免污染纯 OC 文件1.4 与 JNI 的对比对比项Android JNIiOS OC桥接语言C/CObjective-C桥接文件.c/.cppjavah生成头文件.mm直接编写对象管理JNI 局部/全局引用C 手动 new/delete ARC类型映射jstring↔char*NSString*↔std::string回调实现JNI 回调 Java 方法函数指针/std::function dispatch_async二、项目整体结构2.1 目录结构MyApp/ ├── MyApp.xcodeproj/ │ ├── MyApp/ # 主工程目录 │ │ │ ├── AppDelegate.h/m # OC - 应用代理 │ │ │ ├── ViewControllers/ # OC 业务层 │ │ ├── MainViewController.h │ │ └── MainViewController.m │ │ │ ├── Bridge/ # 桥接层重点 │ │ ├── CalculatorBridge.h # OC 接口声明纯 OC │ │ └── CalculatorBridge.mm # OC 实现混编 │ │ │ ├── CPP/ # C 算法核心 │ │ ├── Algorithms/ │ │ │ ├── Calculator.hpp # C 类声明 │ │ │ └── Calculator.cpp # C 类实现 │ │ └── ThirdParty/ # 第三方 C 库 │ │ ├── include/ │ │ └── lib/ │ │ │ ├── Models/ # OC 数据模型 │ ├── Resources/ # 资源文件 │ └── main.m # OC 程序入口 │ └── Tests/ # 单元测试2.2 文件类型速查表文件后缀存放位置编译方式职责.h各处不单独编译接口声明OC 或 C.mViewControllers/, Models/Objective-CUI、业务逻辑.mmBridge/Objective-COC ↔ C 翻译桥接.hppCPP/不单独编译C 类/函数声明.cppCPP/C核心算法实现2.3 依赖关系图MainViewController.m │ #import CalculatorBridge.h ▼ CalculatorBridge.h (纯 OC 接口) │ ▼ CalculatorBridge.mm (OC 实现) │ #import Calculator.hpp │ 持有 C 对象指针 ▼ Calculator.hpp Calculator.cpp (纯 C)三、关键示例代码3.1 C 算法层累加器Calculator.hpp头文件 - 声明#pragmaonceclassCalculator{public:Calculator();// 构造函数~Calculator();// 析构函数intadd(intvalue);// 累加并返回结果voidreset();// 重置为 0intgetCurrent()const;// 获取当前值private:int_sum;};Calculator.cpp源文件 - 实现#includeCalculator.hppCalculator::Calculator():_sum(0){}Calculator::~Calculator(){}intCalculator::add(intvalue){_sumvalue;return_sum;}voidCalculator::reset(){_sum0;}intCalculator::getCurrent()const{return_sum;}3.2 OC 桥接层核心CalculatorBridge.h纯 OC 接口 - 暴露给业务层#importFoundation/Foundation.hNS_ASSUME_NONNULL_BEGIN/// 计算器桥接类 - OC 调用入口interfaceCalculatorBridge:NSObject/// 初始化计算器-(instancetype)init;/// 累加数值并返回当前总和-(NSInteger)addNumber:(NSInteger)number;/// 重置计算器-(void)reset;/// 获取当前总和-(NSInteger)currentSum;endNS_ASSUME_NONNULL_ENDCalculatorBridge.mmOC 实现 - 桥接核心#importCalculatorBridge.h#importCalculator.hpp// ⭐ 引入 C 头文件// 类扩展 - 存放 C 对象指针interfaceCalculatorBridge(){Calculator*_cppCalculator;// ⭐ 持有 C 对象指针}endimplementationCalculatorBridge-(instancetype)init{self[superinit];if(self){// ⭐ 手动创建 C 对象_cppCalculatornewCalculator();NSLog(✅ 计算器已初始化);}returnself;}// ⭐ 核心OC 方法 → C 方法调用-(NSInteger)addNumber:(NSInteger)number{if(!_cppCalculator)return0;intresult_cppCalculator-add((int)number);return(NSInteger)result;}-(void)reset{if(_cppCalculator){_cppCalculator-reset();}}-(NSInteger)currentSum{if(!_cppCalculator)return0;return(NSInteger)_cppCalculator-getCurrent();}// ⭐ 关键手动释放 C 对象-(void)dealloc{if(_cppCalculator){delete _cppCalculator;// ⭐ ARC 不会自动释放 C 对象_cppCalculatornullptr;NSLog(️ C 对象已释放);}}end3.3 OC 业务层使用桥接MainViewController.m业务代码纯 OC#importMainViewController.h#importCalculatorBridge.h// ⭐ 只引入 OC 桥接头文件interfaceMainViewController()property(nonatomic,strong)CalculatorBridge*calculator;property(weak,nonatomic)IBOutlet UILabel*resultLabel;endimplementationMainViewController-(void)viewDidLoad{[superviewDidLoad];// ⭐ 完全 OC 风格感知不到 C 的存在self.calculator[[CalculatorBridge alloc]init];// 累加测试[self.calculator addNumber:10];// → 10[self.calculator addNumber:20];// → 30[self.calculator addNumber:5];// → 35NSInteger sum[self.calculator currentSum];self.resultLabel.text[NSString stringWithFormat:总和: %ld,(long)sum];// 输出: 总和: 35}-(IBAction)onAddButtonClick:(id)sender{NSInteger randomarc4random_uniform(100);NSInteger result[self.calculator addNumber:random];NSLog(➕ 加 %ld当前总和: %ld,(long)random,(long)result);}-(IBAction)onResetButtonClick:(id)sender{[self.calculator reset];self.resultLabel.text已重置;}end3.4 进阶带 C 回调的桥接当 C 算法需要通知 OC 层如进度回调时Calculator.hpp增加回调支持#pragmaonce#includefunctionalclassCalculator{public:// 回调类型定义usingProgressCallbackstd::functionvoid(intpercent);Calculator();~Calculator();voidsetProgressCallback(ProgressCallback callback);voidlongRunningTask();// 耗时任务会触发回调private:ProgressCallback _callback;};CalculatorBridge.mm处理回调#importCalculatorBridge.h#importCalculator.hppinterfaceCalculatorBridge(){Calculator*_cppCalculator;}endimplementationCalculatorBridge-(void)startLongTask{__weaktypeof(self)weakSelfself;// 设置 C 回调_cppCalculator-setProgressCallback([weakSelf](intpercent){// ⭐ 回到主线程更新 UIdispatch_async(dispatch_get_main_queue(),^{[weakSelf updateProgress:percent];});});// 启动耗时任务在子线程执行dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{_cppCalculator-longRunningTask();});}-(void)updateProgress:(int)percent{self.progressView.progresspercent/100.0;self.progressLabel.text[NSString stringWithFormat:%d%%,percent];}end3.5 类型转换速查表OC 类型C 类型转换方式NSIntegerint(int)valueNSString*std::stringstd::string([str UTF8String])std::stringNSString*[NSString stringWithUTF8String:str.c_str()]NSArrayT**std::vectorT遍历[array enumerateObjectsUsingBlock:]NSData*const char*(const char*)[data bytes]转换示例// OC → CNSString*nameJohn;std::string cppNamestd::string([name UTF8String]);// C → OCstd::string cppResultHello;NSString*ocResult[NSString stringWithUTF8String:cppResult.c_str()];四、关键注意事项序号注意点说明1文件后缀桥接文件必须用.mm不能用.m2头文件隔离桥接类的.h不能引入 C 头文件3内存管理C 对象必须手动new/delete4类型转换注意 OC 与 C 类型的相互转换5线程安全C 回调若涉及 UI需切回主线程6编译设置Xcode 默认支持无需额外配置五、总结┌────────────────────────────────────────────────────────────┐ │ 集成流程一图流 │ ├────────────────────────────────────────────────────────────┤ │ │ │ 1. 写 C 算法 → Calculator.hpp Calculator.cpp │ │ ↓ │ │ 2. 写 OC 桥接类 → CalculatorBridge.h (纯 OC 接口) │ │ ↓ │ │ 3. 实现桥接 .mm → CalculatorBridge.mm │ │ - #import Calculator.hpp │ │ - 持有 C 对象指针 _cppCalculator │ │ - OC 方法里调用 _cppCalculator-方法() │ │ - dealloc 里 delete _cppCalculator │ │ ↓ │ │ 4. 业务层调用 → 只 #import CalculatorBridge.h │ │ ↓ │ │ 5. 编译运行 → Xcode 自动处理 .cpp .mm │ │ │ └────────────────────────────────────────────────────────────┘核心要诀.mm是唯一的跨语言接触点负责翻译和生命周期管理OC 业务层完全透明。这就是 iOS 上的 JNI