【发布时间】:2016-07-20 19:43:29
【问题描述】:
前言:我对 iOS 中的 C 集成几乎没有经验,如有任何误解,请随时纠正我。
我有一个项目,它有一个用 C 编写的自定义 2 层“SDK”。coreSDK 对与 通信的 deviceSDK 进行方法调用>ios 框架 执行硬件操作(即启用相机)或检索设备信息(即 NSDocumentDirectory 的路径)。
很遗憾,由于基础架构的原因,SDK 文件扩展名都使用 (.h) 和 (.c),并且无法按照某些来源的建议更改为 (.m)。根据我的阅读,我可以为 ObjC 方法创建 C 回调,但这仅适用于单例,并且 C 回调需要在 (.m) 文件的范围内。
我尝试在 ObjC 中创建一个包装类,使其具有 deviceSDK 从中调用的 C 回调,但是当包含该 (.m) 的标头 (.h) 时,编译器似乎崩溃了。如果我的理解是正确的,那是因为 C 编译器无法解释 (.m) 中包含的 ObjC 语言。
我相信理论上可以使用 ObjC 运行时用纯 C 语言编写 iOS 应用程序,但最好不要走这条路,因为我所看到的复杂得荒谬。
工作流程示例
- ViewController.m 方法调用 coreSDK 方法 (.c)
- coreSDK 方法调用 deviceSDK 方法 (.c)
- deviceSDK 需要检索(例如)NSDocumentDirectory(或启用相机)
我怎样才能做到这一点?
代码示例将是最全面和最受赞赏的。
谢谢!
这些是我已经研究过的一些(不是全部)参考资料...
- How to write ios app purely in c
- Pure C function calling Objective-C method
- C function calling objective C functions
- Using native objective-c method for C callbacks
- Callback methods from C to Objective-C
- Mixing C functions in an Objective-C class
- How to call an Objective-C method from a C method
- How to use pure C files in an objective-C project
编辑:2016-07-21
为了澄清这个问题,我无法从 (.c) 文件中的 C 方法调用 (.m) 文件中的 ObjC 方法,或者想出一种替代方法来检索信息,例如(例如)NSDocumentsDirectory在 ObjC(.m 文件)中并在 (.c) 文件中传递回 C。
示例代码:当然它是不正确的,但它符合我的期望或我希望实现的目标。
//GPS.h
#include "GPSWrapper.h"
STATUS_Code GPSInitialize(void);
//GPS.c
#include "GPS.h"
STATUS_Code GPSInitialize(void) {
GPS_cCallback();
}
//GPSWrapper.h
#import <Foundation/Foundation.h>
@interface GPSWrapper: NSObject
- (void) testObjC;
@end
//GPSWrapper.m
#import "GPSWrapper.h"
static id refToSelf = nil;
@implementation GPSWrapper
- (void) testObjC {
// just an example of a ObjC method call
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(documentsDirectory);
}
@end
static void GPS_cCallback() {
[refToSelf testObjC];
}
【问题讨论】:
-
OSX 和 iOS 音频程序充满了指导性示例:虽然整个程序都是用 Obj-C 编写的,但关键的音频处理代码必须“精简”为纯 C。请查看 SO 标签“core-audio”。
-
这真的没有意义; ObjC 可以 100% 使用 C。是的,这是单向的:你不能在编译为 C 的文件中#include 一个 ObjC 标头,或者发送 ObjC 消息,但是在任何一个中为你的 must-be-C 函数提供包装器都应该没有问题ObjC 类或编译为 ObjC 的文件中的 C 函数。您能否提供一个关于您正在做什么的最小演示,并准确解释它是如何失败的?
-
你可以从Objective-C调用C方法,没什么大不了的。不要重命名,只需包含 .c 和 .h 文件并从那里开始。你想多了。
-
问题不在于从 ObjC 调用 C,而更多的是从 (.c) 文件中的 C 方法调用 (.m) 文件中的 ObjC。我用更多细节和示例测试代码或我的期望更新了我的问题。
标签: ios objective-c c iphone