jSFML

SFML (Simple Fast Multimedia Library) to prosta i przyjemna w użyciu biblioteka dzięki której można zrobić naprawdę dużo. Można przy jej użyciu tworzyć okna i nimi zarządzać, rysować w nich prymitywy lub obrazki, używać efektów post-fx opartych na shaderach, odtwarzać dźwięki, tworzyć aplikacje wielowątkowe i sieciowe. Biblioteka jest w 100% przenośna. Jest ona napisana w C++ w sposób jak najzupełniej obiektowy. Korzystać z niej można pisząc w C, C++, Pythonie, D, Ruby oraz C#. Nie istnieje niestety wraper dla języka Java, w którym piszę na co dzień i który zwyczajnie lubię. Zainteresowałem się więc wplataniem natywnych rozwiązań do języka Java. W ten sposób odkryłem JNI (Java Native Interface), który pozwala na używanie natywnych bibliotek w klasach Java poprzez interfejs napisany w C. Okazało się to o wiele prostsze niż myślałem co skłoniło mnie do rozpoczęcia prac nad jSFML, czyli wraperem natywnego SFML dla języka Java. Jak na razie nie można wiele zrobić w wersji dla Java, ale to może dla tego, że prace zacząłem wczoraj ;). Na razie można stworzyć okno, poustawiać mu parametry, używać generatora liczb pseudolosowych i timera. Po niżej dwie linijki robiące to samo; pierwsza C++, druga Java:
sf::Window App(sf::VideoMode(800, 600, 32), „SFML Window”);
Window window = new Window(new VideoMode(800, 600, 32), „jSFML”);

Każdemu obiektowi w C++ towarzyszy obiekt Java, który w polu typu int o nazwie m_nativePointer trzyma wartość zwracaną przez „new” po stronie natywnej. W ten sposób odwołując się z poziomu Java do metod interfejsu C podając jako jeden z parametrów m_nativePointer można ‚dobrać się’ do odpowiedniego obiektu i wykonać na min pożądaną akcję. Czas życia obiektu po stronie natywnej zależy od czasu życia obiektu w Java, to znaczy, że kiedy niszczony jest obiekt Java wywoływane jest „delete” na wartości m_nativePointer zrzutowanej na odpowiedni typ wskaźnika w funkcji natywnego interfejsu. Odpowiednikiem destruktorów w języku Java jest metoda java.lang.Object.finalize(), która wywoływana jest w momencie niszczenia obiektu przez Garbage Collector (po naszemu”odśmiecacza” ;)) i właśnie w tym momencie wywołuje się z poziomu Java metoda nDestructor(int) (taką nazwę przyjąłem; wszystkie metody natywnego interfejsu mają przedrostek ‚n’). Jak wygląda kod zaprezentuje na przykładzie tworzenia obiektu typu Window. Przepraszam za formatowanie kodu, ale wordpress nie chce ze mną współpracować; jak tylko się z nim uporam poprawie posta.

W klasie Window.java jest deklaracja funkcji natywnego interfejsu:
private native int nConstructor(int ptr_VideoMode, String title, int style, int ptr_WindowSettings);

Metoda nConstructor użyta jest w konstruktorze Java:

public Window(VideoMode mode, String title)
{
    m_nativePointer = nConstructor(mode.getNativePointer(), title, Style.Resize|Style.Close, new WindowSettings().getNativePointer());
}

nConstructor jako funkcja natywnego interfejsu:

JNIEXPORT jint JNICALL Java_SFML_Window_Window_nConstructor__ILjava_lang_String_2II (JNIEnv *env, jobject, jint ptr_VideoMode, jstring title, jint style, jint ptr_WindowSettings)
{
    jboolean isCopy = false;
    const char* cc_title = env->GetStringUTFChars(title, &isCopy);
    jint obj_ptr = (jint)( new sf::Window(
        *((sf::VideoMode*)ptr_VideoMode),
        cc_title,
        style,
        *((sf::WindowSettings*)ptr_WindowSettings) ));
    env->ReleaseStringUTFChars(title, cc_title);
    return obj_ptr;
}

Ogólnie rzecz biorąc – pierwsze koty za płoty. Wiem jak wygląda komunikacja poprzez JNI i już powoli coś zaczyna działać. Następną rzeczą jaką się zajmę będzie klasa sf::Event i obsługa tychże zdarzeń. Kiedy uporam się z tym (a podejrzewam, że nie będzie łatwo, gdyż jednym z pól klasy sf::Event jest unia mająca w sobie 8 strktur) zajme się sf::RenderWindow, sf::Image oraz sf::Sprite. Kiedy i to uda mi się skończyć opublikuję pierwsza wersję biblioteki jSFML.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s