我有一个将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。
答案 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);