Есть ли способ использовать библиотеку Objective-C в C? - PullRequest
3 голосов
/ 20 января 2012

Я хочу использовать приведенный ниже код из 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]];

Есть ли какой-нибудь способ использования библиотеки target-c в c (например, использование библиотеки c ++ в c)?

Ответы [ 2 ]

5 голосов
/ 20 января 2012

Это возможно в основном так же, как если бы вы использовали библиотеку C ++ в C.

Вы должны предоставить API 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 : если вы свяжетесь с библиотекой времени исполнения target-c, вы также сможете напрямую отправлять сообщения объектам, вызывая objc_sendMsg, но это окажется проблемой .. ..

(1) Я не проверял, действительно ли код объективного c имеет смысл.

0 голосов
/ 20 января 2012

Вы можете создать интерфейс-оболочку для того, что вам нужно - так же, как они делают в C ++ -> C.

...