如何在Objective-C类中包装.c本机库方法

时间:2014-07-05 10:27:05

标签: objective-c c cocoa-touch xamarin.ios xamarin

我有一个将wav转换为flac的纯c方法。我需要在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类中为这个本机函数编​​写一个包装函数,并从我的.net绑定中调用该obj-c包装器。

上述声明包装如何在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。

2 个答案:

答案 0 :(得分:0)

我不确定MonoTouch如何绑定到Cocoa touch库,但我会按顺序尝试以下两种方法,看看其中一种是否有效:

首先,我会尝试一个类方法,如下所示:

+(int)sprecFlacEncodeFromFile:(NSString*)wavFile toFile:(NSString*)flacFile;

如果没有正确绑定,我会尝试使用实例方法:

-(int)sprecFlacEncodeFromFile:(NSString*)wavFile toFile:(NSString*)flacFile;

在这两种情况下,Cocoa包装器函数都需要从NSString个对象中提取C字符串。

答案 1 :(得分:0)

使用DllImport直接调用C函数,如果只有一个函数可以调用,则 更容易

不幸的是,你生成它的工具是错误的,它应该是这样的:

[DllImport ("__Internal")]
static extern int Sprec_flac_encode (string wavfile, string flacfile);