2012-08-27 8 views
7

Ich fange an, eine kleine Anwendung für Linux unter dem Mono-Framework zu schreiben, die Anwendung wird im Wesentlichen ein kleines Kiosk-Frontend mit sehr minimaler Benutzerinteraktion sein. Dies soll eine vorherige Version der gleichen Anwendung ersetzen, die zu 100% text-/konsolenbasiert ist.Zugriff auf einen Linux Framebuffer in Mono (Mono.Cairo/GTK #)?

Da dies auf einem Raspberry Pi laufen wird, möchte ich X vermeiden und meine Anwendung direkt mit dem Framebuffer sprechen lassen. Ich werde das Mono-Framework und C# als meine Entwicklungssprache verwenden, da ich C# sehr gut kenne. Portabilität ist in diesem Fall kein Problem.

Ich habe Probleme, passende Bibliotheken und Bindungen zu finden, um mich auf den Framebuffer von Mono jedoch zugreifen zu lassen. Die GTK#-Bibliotheken binden alle explizit an die X11-Schnittstelle, und in jedem Fall scheint es keine vorgefertigten GtkFB-Bibliotheken in Debian Wheezy für die ARM Soft-Float (armel) -Architektur zu geben.

Die Mono.Cairo Bibliothek stellt einen DirectFBSurface Typen, aber der Konstruktor für diese Oberfläche nimmt zwei IntPtr Argumente und ist nicht dokumentiert, damit ich weiß nicht, was in den Konstruktor übergeben werden soll, um richtig die Framebuffer als Kairo Oberfläche zu initialisieren.

Hat jemand mit Mono und C# gearbeitet, um mit dem Linux-Framebuffer zu sprechen, und wenn ja, können Sie grundlegende Beispiele zum Initialisieren und Zeichnen auf der FB bereitstellen oder auf Online-Dokumentation zeigen, um zu helfen?

Update 1

Ich dachte, ich würde versuchen, die DirectFBSurface mit null für beide Konstruktorparameter instanziiert wird, mit dem folgenden Code:

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

ich erwartet hatte dies eine Ausnahme zu erzeugen, das anzeigt, dass null Parameterwerte wurden nicht zugelassen, es sieht jedoch so aus, als wäre die DirectFBSurface entweder nicht in Mono.Cairo implementiert oder nicht in die mit Debian Wheezy (armel) gelieferte Bibliothek kompiliert:

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 

So scheint es, dass der Mono.Cairo Ansatz wahrscheinlich nicht für meine Bedürfnisse funktionieren wird, und wie oben erwähnt, GTK# Framebuffer-Bibliothek scheint nicht Teil von Debian Wheezy für Armel zu sein. Gibt es einen weiteren Satz von Bibliotheken, mit denen ich von Mono aus auf den Linux Framebuffer zugreifen kann?

+0

bist du das? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton

+0

Wenn ja, könnten Sie auf eine Software-Oberfläche in Kairo zeichnen und es von Zeit zu Zeit auf die SDL-Oberfläche übertragen. – IanNorton

+2

Es scheint, dass Sie einen Zeiger auf eine native IDirectFB und eine IDirectFBSurface übergeben müssen. Hier ist die Quelle für Mono.Cairo: https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs Und hier ist cairo Quelle für diesen Konstruktor: http : //cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham

Antwort

2

Die EntryPointNotFoundException Sie erhalten, bedeutet, dass das Symbol cairo_directfb_surface_create mit (IntPtr, IntPtr) als Argumente nicht in Ihrer Bibliothek libcairo.so.2 von Debian gefunden wurde. Dies kann wahrscheinlich der Fall sein, wenn directfb zur Kompilierzeit in Kairo nicht aktiviert wurde. Sie können, indem Sie in kairo für directfb Unterstützung überprüfen:

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

Wenn das Ergebnis (Output) leer ist, Sie directfb Unterstützung fehlt. In diesem Fall müssen Sie cairo mit --enable-directfb erneut kompilieren, das an das configure-Skript übergeben wurde.

Ich habe auf einer openSUSE 12.1 und Fedora 17 Box getestet, und beide scheinen nicht standardmäßig Directfb aktiviert Cairo. Ich weiß aber nicht über Debian, du musst dich selbst testen.