如何在Mono中访问Linux Framebuffer(Mono.Cairo / GTK#)?

时间:2012-08-27 01:20:40

标签: c# mono gtk# cairo framebuffer

我开始在Mono框架下为Linux编写一个小应用程序,该应用程序基本上是一个小型的kiosk前端,用户交互非常少。这是为了替换基于100%文本/控制台的同一应用程序的先前版本。

由于这将在Raspberry Pi上运行,我想避免运行X并让我的应用程序直接与Framebuffer对话。我开始使用Mono框架和C#作为我的开发语言,因为我非常了解C#。在这种情况下,可移植性不是问题。

我在查找适当的库和绑定时遇到了一些麻烦,让我从Mono访问Framebuffer。 GTK#库都明确绑定到X11接口,无论如何,在Debian Wheezy中似乎没有为ARM Soft-Float(armel)架构预构建的GtkFB库。

Mono.Cairo库公开DirectFBSurface类型,但该表面的构造函数需要两个IntPtr参数,并且没有记录,因此我不知道应该将哪些内容传递给构造函数将Framebuffer正确初始化为Cairo Surface。

有没有人使用Mono和C#与Linux Framebuffer交谈,如果有的话,你能提供基本的例子来初始化并开始绘制到FB上,或指向在线文档来协助吗?

更新1

我以为我会尝试使用null为两个构造函数参数实例化DirectFBSurface,并使用以下代码:

public static void Main(string[] args)
{
    // ...
    DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null));
    // ...
}

我希望这会生成一个异常,表明不允许null个参数值,但是它看起来好像DirectFBSurface要么没有在Mono.Cairo中实现,要么没有编译到随附的库中Debian Wheezy(阿梅尔):

Unhandled Exception: System.EntryPointNotFoundException: cairo_directfb_surface_create
  at (wrapper managed-to-native) Cairo.NativeMethods:cairo_directfb_surface_create (intptr,intptr)
  at Cairo.DirectFBSurface..ctor (IntPtr dfb, IntPtr dfb_surface) [0x00000] in <filename unknown>:0
  at Info.Insch.SandBox.TestCairo.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

所以似乎Mono.Cairo方法可能无法满足我的需求,如上所述,GTK# Framebuffer库似乎不是Armel的Debian Wheezy的一部分。是否有另一组库可用于从Mono访问Linux Framebuffer?

1 个答案:

答案 0 :(得分:2)

你得到的EntryPointNotFoundException意味着在debian的libcairo.so.2库中找不到带有(IntPtr,IntPtr)作为参数的符号cairo_directfb_surface_create。如果在cairo的编译时没有启用directfb,情况可能就是这种情况。您可以通过执行以下操作检查cairo中的directfb支持:

readelf -Ws /usr/lib/libcairo.so.2 | grep directfb

如果结果(输出)为空,则缺少directfb支持。在这种情况下,您必须使用传递给configure脚本的--enable-directfb参数重新编译cairo。

我已在openSUSE 12.1和Fedora 17上测试过,默认情况下两者似乎都没有发布directfb启用的cairo。我不知道debian,你必须自己测试一下。