2012-08-27 22 views
7

Tôi bắt đầu viết một ứng dụng nhỏ cho Linux theo khung Mono, ứng dụng về bản chất sẽ là một giao diện người dùng nhỏ với tương tác rất nhỏ của người dùng. Điều này là để thay thế một phiên bản trước đó của cùng một ứng dụng được dựa trên 100% văn bản/bàn điều khiển.Làm thế nào để truy cập vào bộ đệm Framebuffer Linux trong Mono (Mono.Cairo/GTK #)?

Vì điều này sẽ chạy trên một Raspberry Pi, tôi muốn tránh chạy X và yêu cầu ứng dụng của tôi trao đổi trực tiếp với Framebuffer. Tôi đang sử dụng khung Mono và C# làm ngôn ngữ phát triển của mình vì tôi biết C# rất tốt. Tính di động không phải là một vấn đề trong trường hợp này.

Tôi đang gặp sự cố khi tìm các thư viện và liên kết phù hợp để cho phép tôi truy cập Framebuffer từ Mono. Các thư viện GTK# tất cả ràng buộc rõ ràng với giao diện X11, và trong mọi trường hợp, dường như không có thư viện GtkFB được dựng sẵn trong Debian Wheezy cho kiến ​​trúc ARM Soft-Float (armel).

Thư viện Mono.Cairo cho thấy một loại DirectFBSurface, tuy nhiên các nhà xây dựng cho bề mặt mà phải mất hai IntPtr đối số và không được ghi nhận vì vậy tôi không biết những gì nên được chuyển vào constructor để khởi động các bộ đệm khung như một bề mặt Cairo.

Có ai đã từng làm việc với Mono và C# để nói chuyện với bộ đệm Framebuffer của Linux không, và nếu có, bạn có thể cung cấp các ví dụ cơ bản để khởi tạo và bắt đầu vẽ lên FB hoặc trỏ tới tài liệu trực tuyến để hỗ trợ không?

Cập nhật 1

tôi nghĩ rằng tôi muốn thử instantiating DirectFBSurface với null cho cả thông số nhà xây dựng, với đoạn mã sau:

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

tôi mong đợi này để tạo ra một ngoại lệ chỉ ra rằng null giá trị tham số không được phép, tuy nhiên thay vào đó, nó trông như thể DirectFBSurface không được triển khai trong Mono.Cairo hoặc không được biên dịch vào thư viện được gửi kèm với 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 

Vì vậy, có vẻ như cách tiếp cận Mono.Cairo có lẽ sẽ không làm việc cho nhu cầu của tôi, và như đã nói ở trên, GTK# thư viện bộ đệm khung dường như không phải là một phần của Debian Wheezy cho armel. Có một bộ thư viện nào khác mà tôi có thể sử dụng để truy cập vào Framebuffer Linux từ Mono không?

+0

là bạn này? http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15788&p=160933 – IanNorton

+0

Nếu vậy, bạn có thể vẽ lên bề mặt phần mềm ở Cairo và ghi nó lên bề mặt SDL thường xuyên. – IanNorton

+2

Dường như bạn cần chuyển con trỏ tới IDirectFB và IDirectFBSurface. Đây là nguồn cho Mono.Cairo: https://github.com/mono/mono/blob/master/mcs/class/Mono.Cairo/Mono.Cairo/DirectFBSurface.cs Và đây là nguồn cairo cho hàm tạo đó: http : //cgit.freedesktop.org/cairo/tree/src/cairo-directfb-surface.c#n499 – joncham

Trả lời

2

EntryPointNotFoundException bạn nhận được, có nghĩa là biểu tượng cairo_directfb_surface_create với (IntPtr, IntPtr) làm đối số không được tìm thấy trong thư viện libcairo.so.2 của bạn từ debian. Điều này có thể là trường hợp, nếu directfb không được kích hoạt tại thời gian biên dịch trong cairo. Bạn có thể kiểm tra hỗ trợ directfb trong cairo bằng cách thực hiện:

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

Nếu kết quả (đầu ra) trống, bạn thiếu hỗ trợ directfb. Trong trường hợp này, bạn phải biên dịch lại cairo với đối số --enable-directfb được truyền cho kịch bản cấu hình.

Tôi đã thử nghiệm trên một hộp openSUSE 12.1 và Fedora 17, và cả hai dường như không giao hàng trực tiếp được kích hoạt cairo theo mặc định. Tôi không biết về debian, bạn sẽ phải tự kiểm tra.