如何在Xamarin.iOS中正确包装本机c库

时间:2014-07-08 14:47:07

标签: c binding xamarin.ios xamarin native

我正在尝试将原生c(非客观c)库绑定到Xamarin.iOS。

我的项目包含.c和.h文件,可以在XCode中正常运行。项目的实际.h和.m不包含任何函数,我只需要使用c定义的例程。

包含所需方法定义的h文件如下所示:

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int sprec_flac_encode(const char *wavfile, const char *flacfile);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* !__SPREC_FLAC_ENCODER_H__ */

我已将其构建为胖二进制文件,但Xamarin文档中的规范尚不清楚。鉴于我正在绑定本机库,我是否需要在我的解决方案中使用Binding项目。无论如何,我需要一个包装器调用来放入我的DLLImport定义?这个过程记录在哪里?我需要一个针对我特定情况的教程。

P.S。目标Sharpie正在生成一个空的绑定类,如果我“提供”它我的.h文件,可能因为它不是客观的c。

1 个答案:

答案 0 :(得分:5)

由于它是C代码,您应该使用PInvoke Interop Assistant之类的东西来生成C#绑定。

public partial class NativeMethods 
{
    [DllImport("<libnamehere>", 
        EntryPoint="sprec_flac_encode", 
        CallingConvention = CallingConvention.Cdecl)]
    public static extern int FlacEncode(
        [MarshalAs(UnmanagedType.LPStr)] string wavfile, 
        [MarshalAs(UnmanagedType.LPStr)] string flacfile) ;

}

C库不需要ObjectiveC绑定项目。只需构建本机库,并使用Dll导入将其添加到项目中。