簡體   English   中英

在Java中使用C代碼的快速步驟

[英]Quick steps to use C code with Java

我正在開發一款具有簡單像素藝術精靈的游戲。 由於我計划使其可擴展(我的意思是整個游戲圖形縮放),因此我想實現一種適用於像素藝術的良好縮放算法,在互聯網上搜索時發現了HQX,以便可以縮放所有子畫面(實時),然后使用這些新版本。

我發現用C代碼實現了這種HQX算法,一切都簡化為一個簡單的函數,該函數采用源圖像的uint32_t數組,並填充一個已經分配了sprite縮放版本的新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 Jrug調用此方法。 我應該完成哪些任務? 另外,我想知道性能是否會成為問題,我不這么認為,因為,如果JNI調用很昂貴,則僅對每個sprite都進行一次調用(但是可能需要大量內存才能從JVM和本機代碼來回復制)。

我知道這兩種語言(Java和C),因此,假設它很簡單,我只需要知道執行此任務的步驟,否則,我將參考JNI進行研究。

提前致謝

為什么不將C代碼轉換為Java? 除非涉及指針,否則轉換中的工作可能很少。

首先,我會遵循wallyk的建議,其次是尋找現有的Java實現,或者,如果希望的話,請閱讀本教程

如果您不經常縮放Sprite,則可能會發現使用JNA (Java Native Access)比使用JNI更容易。 它友好得多,但速度較慢。 使用JNA,您可能不需要編寫任何其他本機代碼。

如果確實使用JNI,通常會在Java中創建“本機方法”(帶有“本機”限定符的空方法),使用javah生成C頭文件,並編寫相應的C源文件以實現“本機”。方法。”在運行時,您需要使用System.loadLibrary()加載本機庫。(如果在Mac上,則動態庫擴展名必須為.jnilib。)

JNI調用可以以納秒為單位進行度量。 大型陣列可能會被復制,從而增加了時間。 今年早些時候,我測量了大約100,000個int元素數組的時間,大約為80微秒。 我認為可以使用java.io類型的DirectByteBuffer避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM