2012-08-27 22 views
7

我開始在Mono框架下爲Linux編寫一個小型應用程序,該應用程序本質上是一個小型自助服務終端,用戶交互非常少。這是取代基於100%文本/控制檯的相同應用程序的先前版本。如何訪問Mono(Mono.Cairo/GTK#)中的Linux Framebuffer?

因爲這將在Raspberry Pi上運行,所以我想避免運行X並讓我的應用程序直接與Framebuffer對話。我開始使用Mono框架和C#作爲我的開發語言,因爲我非常瞭解C#。在這種情況下,可移植性不是問題。

我在查找適當的庫和綁定時遇到了一些麻煩,但是讓我從Mono訪問Framebuffer。 GTK#庫都顯式綁定到X11接口,並且在任何情況下,Debian Wheezy都沒有爲ARM Soft-Float(armel)體系結構預構建GtkFB庫。

Mono.Cairo庫公開一個DirectFBSurface類型,但是構造爲表面採用兩個IntPtr參數並沒有記錄,所以我不知道應該怎樣傳遞到構造函數正確初始化幀緩衝區的開羅表面。

有沒有人與Mono和C#一起討論Linux Framebuffer,如果可以的話,你能否提供基本的例子來初始化並開始繪製到FB上,或者指向在線文檔來協助?

更新1

我想我會嘗試實例化DirectFBSurface與null兩個構造函數的參數,用下面的代碼:

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

我預計在產生一個異常,表明null參數值是不允許的,但是它看起來好像DirectFBSurface沒有在Mono.Cairo中實現,或者沒有被編譯到Debian 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#幀緩衝庫似乎並沒有成爲阿梅爾Debian的喘息的一部分。是否有另一套我可以用來從Mono訪問Linux Framebuffer的庫?

+0

這是你的嗎? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton

+0

如果是這樣,您可以在開羅繪製軟件表面,並且每隔一段時間將其噴到SDL表面上。 – IanNorton

+2

看來您需要將指針傳遞給本機IDirectFB和IDirectFBSurface。這裏是Mono.Cairo的源代碼:https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs這裏是該構造函數的cairo源代碼:http ://cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham

回答

2

您得到的EntryPointNotFoundException表示符號cairo_directfb_surface_create(IntPtr,IntPtr)作爲參數在您的libcairo.so.2庫中找不到debian。如果在開羅編譯時沒有啓用directfb,情況可能如此。您可以通過執行在開羅檢查DirectFB的支持:

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

如果結果(輸出)是空的,你缺乏DirectFB的支持。在這種情況下,您必須使用傳遞給配置腳本的參數--enable-directfb重新編譯cairo。

我已經在openSUSE 12.1和Fedora 17盒子上測試過了,並且默認情況下它們都沒有運行directfb enabled cairo。我不知道debian,但你必須測試自己。