Быстрые шаги для использования кода C с Java - PullRequest
1 голос
/ 17 декабря 2010

Я работаю над игрой, в которой есть простые пиксельные спрайты. Так как я планирую сделать это масштабируемым (я имею в виду масштабирование всей игровой графики), я хотел бы реализовать хороший алгоритм масштабирования, подходящий для пиксельной графики, при поиске в Интернете я нашел этот HQX , чтобы я мог масштабируйте все спрайты (не в реальном времени), а затем используйте эти новые версии.

Я нашел реализацию этого алгоритма HQX в коде C, все сводится к простой функции, которая принимает массив uint32_t исходного изображения и заполняет новый массив uint32_t, уже выделенный масштабированной версией спрайта.

Подпись просто

HQX_API void HQX_CALLCONV hq2x_32( uint32_t * sp, uint32_t * dp, int Xres, int Yres )

где два символа объявлены как

#if defined( __GNUC__ )
    #ifdef __MINGW32__
        #define HQX_CALLCONV __stdcall
    #else
        #define HQX_CALLCONV
    #endif
#else
    #define HQX_CALLCONV
#endif

#if defined(_WIN32)
    #ifdef DLL_EXPORT
        #define HQX_API __declspec(dllexport)
    #else
        #define HQX_API __declspec(dllimport)
    #endif
#else
    #define HQX_API
#endif

Так что цель может быть построена как отдельная библиотека или библиотека.

Что я хотел бы сделать, так это вызвать этот метод из Java через JNI. Какие задачи я должен выполнить, чтобы сделать это? Кроме того, я хотел бы знать, если производительность будет проблемой или нет, я так не думаю, поскольку, даже если вызов JNI стоит дорого, для каждого спрайта выполняется только вызов (но, возможно, для этого требуется много памяти) копироваться туда-сюда из JVM и собственного кода).

Я знаю оба языка (Java и C), поэтому мне просто нужно знать шаги, связанные с выполнением этой задачи, при условии, что это достаточно просто, в противном случае я просто возьму ссылку на JNI и изучу ее ..

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 17 декабря 2010

Почему бы вам не преобразовать код C в Java?Возможно, в преобразовании будет очень мало работы, если не задействованы указатели.

3 голосов
/ 17 декабря 2010

Сначала я последую совету Уоллика, потом поищу существующую реализацию Java или, если все надеются в случае потери, прочитает учебник .

2 голосов
/ 17 декабря 2010

Если вы редко масштабируете спрайты, вам может оказаться проще работать с JNA (Java Native Access), чем с JNI. Это намного дружелюбнее, но медленнее. С JNA вам может не потребоваться писать какой-либо дополнительный нативный код.

Если вы используете JNI, обычно вы создаете «нативные методы» в Java (пустые методы с «нативным» квалификатором »), используете javah для создания заголовочного файла C и пишите соответствующий исходный файл C для реализации «нативный метод». Во время выполнения вам необходимо загрузить нативную библиотеку с помощью System.loadLibrary () . (Если вы используете Mac, расширение динамической библиотеки должно быть .jnilib.)

Вызовы JNI могут измеряться в наносекундах. Большие массивы могут быть скопированы, увеличивая это время. Ранее в этом году я измерил его на 80 микросекундах для массива 100 000 элементов. Я думаю, этого можно избежать с помощью java.io-типа DirectByteBuffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...