7

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

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

但是,我在找到合适的库和绑定以让我从 Mono 访问帧缓冲区时遇到了一些麻烦。这些GTK#库都显式绑定到 X11 接口,无论如何,Debian Wheezy 中似乎没有为 ARM Soft-Float (armel) 架构预构建的 GtkFB 库。

Mono.Cairo库公开了一个DirectFBSurface类型,但是该表面的构造函数需要两个IntPtr参数并且没有记录,因此我不知道应该将什么传递给构造函数以将帧缓冲区正确初始化为开罗表面。

是否有人使用 Mono 和 C# 与 Linux 帧缓冲区通信,如果是,您能否提供基本示例来初始化并开始在 FB 上绘图,或指向在线文档以提供帮助?

更新 1

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

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

我希望这会生成一个异常,表明null不允许使用参数值,但是它看起来好像 DirectFBSurface 没有在Mono.CairoDebian Wheezy (armel) 附带的库中实现或没有编译到库中:

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 库似乎不是 Debian Wheezy for armel 的一部分。是否有另一组库可用于从 Mono 访问 Linux 帧缓冲区?

4

1 回答 1

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 支持。在这种情况下,您必须使用--enable-directfb传递给配置脚本的参数重新编译 cairo。

我已经在 openSUSE 12.1 和 Fedora 17 机器上进行了测试,默认情况下两者似乎都没有提供启用 directfb 的 cairo。不过我不知道debian,你必须自己测试。

于 2012-09-16T07:17:02.917 回答