如何在 Xamarin.iOS 中正确包装本机 c 库
Posted
技术标签:
【中文标题】如何在 Xamarin.iOS 中正确包装本机 c 库【英文标题】:How do I correctly wrap native c library in Xamarin.iOS 【发布时间】:2014-08-29 08:51:36 【问题描述】:我正在尝试将本机 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 定义?这个过程记录在哪里?我需要针对我的特殊情况的教程。
附:如果我“输入”我的 .h 文件,Objective Sharpie 会生成一个空的绑定类,可能是因为它不是 Objective-c。
【问题讨论】:
【参考方案1】:由于它是 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 导入将其添加到您的项目中。
【讨论】:
谢谢。你是怎么知道const char *
变成[MarshalAs(UnmanagedType.LPStr)]
的?你能告诉我在哪里可以读到它吗?
这里是编组参考:msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx以上是关于如何在 Xamarin.iOS 中正确包装本机 c 库的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Xamarin iOS PickView 获取价值?
Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机
在 Xamarin.IOS 中执行本机代码时获得 SIGSEGV
从 Xamarin.iOS 绑定库中引用 Storyboard