【问题标题】:How to wrap a .c native library method in Objective-C class如何在 Objective-C 类中包装 .c 本机库方法
【发布时间】:2014-08-26 10:49:48
【问题描述】:

我有一个纯 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 类中为这个本机函数编​​写一个包装器函数,然后从我的 .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,然后尝试弄清楚如何修复DLL 导入。

【问题讨论】:

  • 我很难相信 Xamarin 允许您绑定 Objective-C 方法而不是 C 方法。他们的docs 的快速谷歌似乎同意这一点。
  • @JustSid,所以你说我可以直接调用纯c方法。如果是这样,是的,我也这么认为。为什么我没有选择我刚刚在问题文本的“附加信息”部分中描述的那条路线。不过感谢您的提示。
  • 检查我链接的文档页面,它使用的语法与您不同。我无法测试它,因为我不使用 C#/Xamarin,但它可能值得一试。

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


【解决方案1】:

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

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

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

如果这不能正确绑定,我会尝试使用实例方法:

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

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

【讨论】:

    【解决方案2】:

    使用DllImport 直接调用C 函数,如果你只有一个函数要调用,要容易得多

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 2017-04-13
      • 2014-08-29
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多