#objective-c #c #cocoa-touch #xamarin.ios #xamarin
#objective-c #c #cocoa-touch #xamarin.ios #xamarin
Вопрос:
У меня есть метод чистого c, который преобразует wav в flac. Мне нужно использовать эту функциональность в проекте Xamarin MonoTouch. Xamarin допускает привязку к статическим библиотекам Cocoa Touch, где определения методов написаны на objective-c, а не на чистом c.
Итак, в XCode я собрал проект статической библиотеки Cocoa Touch, в котором есть файлы .h и .c с встроенной функциональностью. Я также настроил все для создания «толстой» мультиплатформенной библиотеки в виде файла .a.
Теперь единственный метод, который мне нужно предоставить через objective-c, выглядит следующим образом в объявлении .h:
int sprec_flac_encode(const char *wavfile, const char *flacfile);
Я предполагаю, что мог бы просто написать функцию-оболочку для этой собственной функции в классе objective-c и просто вызвать эту оболочку obj-c из моей привязки .net.
Как бы вышеупомянутый перенос объявления выглядел в objective-c?
Дополнительная информация
Я знаю, что могу просто обернуть собственный метод C. Я использовал автоматизированный инструмент для создания оболочки на C #. И это привело к объявлению метода следующего вида:
[DllImport ("/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/iOSNative/SpeechRecognitionC/GoogleSpeechRecognizerC/GoogleSpeechRecognizerC/flac_encoder.h")]
int Sprec_flac_encode (ref string wavfile, ref string flacfile);
Компилятор .Net, похоже, не понимает этот тип вызова DllImport, и поэтому я думаю, что я мог бы обернуть в obj-c и экспортировать это в .net, а затем попытаться выяснить, как исправить DllImport.
Комментарии:
1. Мне трудно поверить, что Xamarin позволяет вам привязывать методы Objective-C, но не методы C. Быстрый поиск в Google их документов , похоже, согласен с этим.
2. @JustSid, то есть вы хотите сказать, что я могу напрямую вызвать метод чистого c. Если да, то да, я тоже подумал об этом. Почему я не выбрал этот маршрут, который я только что описал в разделе «Дополнительная информация» текста вопроса. Хотя спасибо за совет.
3. Проверьте страницу документации, на которую я ссылался, она использует другой синтаксис, чем вы. Я не могу его протестировать, поскольку не использую C # / Xamarin, но, вероятно, попробовать стоит.
Ответ №1:
Я не уверен, как MonoTouch привязывается к библиотекам Cocoa touch, но я бы попробовал следующие два подхода по порядку и посмотрел, работает ли один из них:
Во-первых, я бы попробовал метод класса, подобный этому:
(int)sprecFlacEncodeFromFile:(NSString*)wavFile toFile:(NSString*)flacFile;
Если это не привязывается должным образом, я бы попробовал использовать метод экземпляра:
-(int)sprecFlacEncodeFromFile:(NSString*)wavFile toFile:(NSString*)flacFile;
В обоих случаях функции-оболочке Cocoa потребуется извлекать строки C из NSString
объектов.
Ответ №2:
Используйте a DllImport
для прямого вызова функции C, это намного проще, если у вас есть только одна функция для вызова.
К сожалению, ваш инструмент для его генерации неверен, это должно быть что-то вроде этого:
[DllImport ("__Internal")]
static extern int Sprec_flac_encode (string wavfile, string flacfile);