Monotouch绑定到Linea Pro SDK

时间:2012-09-15 21:34:05

标签: c# ios binding xamarin.ios linea-pro

我正在尝试创建一个绑定到Linea Pro(这是他们在Apple Stores,Lowes中使用的条形码扫描器)SDK。我使用David Sandor's绑定作为参考,但自2011年1月以来SDK已更新几次。

除了 playSound 调用之外,我已经完成了大部分工作,用于在Linea Pro设备上播放声音。

SDK中的.h文件的调用如下:

-(BOOL)playSound:(int)volume beepData:(int *)data length:(int)length error:(NSError **)error;

我尝试将int [],NSArray和IntPtr用于int [],但似乎没有任何效果。

我绑定的最后一次失败迭代看起来像:

[Export ("playSound:beepData:length:")]
void PlaySound (int volume, NSArray data, int length);

现在,这根本不起作用。另请注意,我不知道如何处理错误:(NSError **)错误部分。

我对C很缺乏认识,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

除非Objective-C代码使用NSArray,否则您不能使用NSArray,即生成器允许我们将一些ObjC构造映射到.NET类型(例如NSStringstring })但它不允许你重新定义ObjC类型。

-(BOOL)playSound:(int)volume beepData:(int *)data length:(int)length error:(NSError **)error;

应该是:

[Export ("playSound:beepData:length:error:")]
bool PlaySound (int volume, IntPtr data, int length, out NSError error);

您需要将data封送到IntPtr

IntPtr data = Marshal.AllocHGlobal (length);
Marshal.WriteInt32 (data1, 0);

然后将其释放。

Marshal.FreeHGlobal (data);

最好使用调用内部绑定的公共帮助程序方法。您可以通过在其定义中添加PlaySound属性来制作internal方法[Internal]。所以它变成了:

[Export ("playSound:beepData:length:error:")][Internal]
bool PlaySound (int volume, IntPtr data, int length, out NSError error);

并在绑定中包含以下代码(例如API.cs):

bool PlaySound (int volume, int[] data)
{
    // I assume length is byte-based (check the docs)
    int length = data.Length * 4; 
    IntPtr p = Marshal.AllocHGlobal (length);
    int j = 0;
    for (int i=0; i < length; i+=4)
        Marshal.WriteInt32 (p [j++], i);
    NSError error;
    bool result = PlaySound (volume, p, length, out error);
    // free memory before throwing the exception (if any)
    Marshal.FreeHGlobal (data);
    if (error != null)
       throw new Exception (error.LocalizedDescription);
    return result;
}

注意:完全未经验证:-)我没有硬件,SDK或文档。 YMMV,但应该接近。

答案 1 :(得分:1)

我遇到了同样的麻烦。然而,上面的poupou所提供的帮助足以让我走上正轨。我的linea pro设备现在在我要求的时候发出双响声,所以我想我应该使用经过测试的代码进行跟进。原谅任何风格的混乱,这是我的第一篇文章到stackoverflow ......

这是我使用的导出定义。它与上面提到的相同,只是想验证它是否有效。

    [Export ("playSound:beepData:length:error:")]
    bool PlaySound (int volume, IntPtr data, int length, out NSError error);

从那里开始,我只需要学习足够的c#以使编组工作顺利进行。 (我也是c#的新手)正如你所看到的,它只是从上面发布的内容中得到补丁。非常感谢你指出我正确的方向!

    public void Beep()
    {
        int[] sound = {2730, 150, 0, 30, 2730, 150};
        PlaySound(100, sound);
    }

    public bool PlaySound(int volume, int[] data)
    {

        // length is byte-based
        int length = data.Length*4;
        IntPtr p = Marshal.AllocHGlobal(length);

        for (int i = 0; i < data.Length; i ++)
        {
            Marshal.WriteInt32(p, i*4, data[i]);
        }

        NSError error;
        bool result = dtDevice.PlaySound(volume, p, length, out error);

        // free memory before throwing the exception (if any)
        Marshal.FreeHGlobal(p);

        if (error != null)
            throw new Exception(error.LocalizedDescription);

        return result;

    }