有没有办法在C中使用Objective-C库?

时间:2012-01-20 16:57:49

标签: iphone objective-c c ios

我想使用C中的以下代码(使用arm-gcc编译)

NSString *newText;

CLLocationManager * locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
//[locationManager setDelegate:self];

CLLocation* location = [locationManager location];

newText = [[NSString alloc] initWithFormat: @"Your Position : %f %f", [location horizontalAccuracy], [location verticalAccuracy]];

有没有办法在c中使用objective-c库(比如在c中使用c ++库)?

2 个答案:

答案 0 :(得分:5)

基本上可以像在C中使用C ++库一样。

您必须提供包装C API。如果定义普通C函数,则应该可以从另一个普通的C可执行文件轻松访问它们。

您需要一些头文件:

#ifndef __OBJC__
typedef void* id;
#endif

id api_getlocation();
const char* api_location_to_text(id location);
void api_free_location(id location);

代码(1):

id api_getlocation()
{
  CLLocationManager * locationManager = [[CLLocationManager alloc] init];  
  [locationManager startUpdatingLocation];
  [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
   //[locationManager setDelegate:self];

   CLLocation* location = [locationManager location];
   return [location retain];
}

const char* api_location_to_text(id location) 
{
   NSString* newText = [NSString stringWithFormat: @"Your Position : %f %f", [location horizontalAccuracy], [location verticalAccuracy]];

   return strdup([newText UTF8String]);
}

void api_free_location(id location)
{
    [location release];
}

然后你可以从C代码中使用它,包括你的头文件并调用这些C函数。

NB :如果你链接到objective-c运行时库,你也应该能够通过调用objc_sendMsg直接向对象发送消息,但这将证明是一种痛苦在....

(1)我没有检查Objective-c代码是否真的有意义。

答案 1 :(得分:0)

您可以为所需内容创建一个包装器界面 - 就像在C ++中一样 - >下进行。