objective-c - 如何在 Objective-C 类中包装 .c native 库方法

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

我有一个将 wav 转换为 flac 的纯 c 方法。我需要在 Xamarin MonoTouch 项目中使用此功能。 Xamarin 允许绑定(bind)到 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 类中为这个 native 函数编​​写一个包装函数,然后从我的 .net 绑定(bind)中调用那个 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,然后尝试找出如何修复Dll导入。

最佳答案

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

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

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

如果绑定(bind)不正确,我会尝试使用实例方法:

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

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

关于objective-c - 如何在 Objective-C 类中包装 .c native 库方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585447/

相关文章:

objective-c - 如何使用 keywindow 无边框窗口(覆盖)覆盖全屏游戏?

ios - 核心定位精度

iphone - 如何在iPhone应用程序中通过修改图像的像素值来为UIImage添加色调效果

ios - 方法被多次调用

c - 如何解决错误 C2059 : syntax error : '__asm' in Visual C++ 2010 Express

C 用 fgets 读取多行

c - 没有加号运算符的总和(添加 2 个数字)

iphone - 如何列出 .a 文件中的文件

cocoa-touch - 触发一个方法在单独的线程中运行

objective-c - X代码 4.3 : Static Library Generation