Java使用FFM?API調用SDL詳解
首先我們需要創(chuàng)建一個Gradle
項目,之后設置項目的JDK
版本,設置為22
及以上版本。
plugins { kotlin("jvm") version "2.1.0" } group = "cn.enaium" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { testImplementation(kotlin("test")) } tasks.test { useJUnitPlatform() } kotlin { jvmToolchain(23) }
接著我們在當前目錄初始化git
倉庫,之后需要添加一個子模塊。、
git init git submodule add git@github.com:libsdl-org/SDL.git SDL
之后編寫生成接口的腳本,在這之前你必須安裝CMake和jextract到環(huán)境變量中。
$sdl_path = "SDL"
mkdir "$sdl_path/build"; cmake -DCMAKE_BUILD_TYPE=Release "$sdl_path" -B "$sdl_path/build"; cmake --build "$sdl_path/build" --config Release --parallel
jextract --include-dir "$sdl_path/include" --dump-includes "$sdl_path/build/includes.txt" "$sdl_path/include/SDL3/SDL.h"
jextract --include-dir "$sdl_path/include" --output src/main/java --target-package org.libsdl --library SDL3 --use-system-load-library "@$sdl_path/build/includes.txt" "$sdl_path/include/SDL3/SDL.h"
首先是使用CMake
編譯SDL
,之后使用jextract
生成Java
接口,之后運行腳本,這樣就會在src/main/java
生成SDL3
的接口。
接著我們回到build.gradle.kts
,添加application
插件,之后將編譯好的路徑添加到啟動參數中。
plugins { application } application { mainClass = "MainKt" applicationDefaultJvmArgs = listOf("-Djava.library.path=SDL/build/Release", "--enable-native-access=ALL-UNNAMED") }
之后就可以調用SDL
的接口了。
import org.libsdl.* import org.libsdl.SDL_h_1.* import java.lang.foreign.Arena /** * @author Enaium */ fun main() { Arena.ofConfined().use { val init = SDL_h_2.SDL_Init(SDL_INIT_VIDEO() and SDL_INIT_EVENTS()) if (!init) { println("SDL_Init Error: ${SDL_h_3.SDL_GetError()}") return } val windowPtr = it.allocate(C_POINTER) val rendererPtr = it.allocate(C_POINTER) SDL_CreateWindowAndRenderer(it.allocateFrom("Hello World"), 640, 480, 0, windowPtr, rendererPtr) val window = windowPtr.get(C_POINTER, 0) val renderer = rendererPtr.get(C_POINTER, 0) val rect = SDL_FRect.allocate(it) SDL_FRect.x(rect, 100f) SDL_FRect.y(rect, 100f) SDL_FRect.w(rect, 440f) SDL_FRect.h(rect, 280f) val event = SDL_Event.allocate(it) var quit = false while (!quit) { while (SDL_PollEvent(event)) { when (SDL_Event.type(event)) { SDL_EVENT_QUIT() -> { quit = true } SDL_EVENT_KEY_DOWN() -> { when (SDL_KeyboardEvent.key(SDL_Event.key(event))) { SDLK_UP() -> { SDL_FRect.y(rect, SDL_FRect.y(rect) - 5) } SDLK_DOWN() -> { SDL_FRect.y(rect, SDL_FRect.y(rect) + 5) } SDLK_LEFT() -> { SDL_FRect.x(rect, SDL_FRect.x(rect) - 5) } SDLK_RIGHT() -> { SDL_FRect.x(rect, SDL_FRect.x(rect) + 5) } } } } } SDL_h_2.SDL_SetRenderDrawColor(renderer, 33.toByte(), 33.toByte(), 33.toByte(), 255.toByte()) SDL_h_2.SDL_RenderClear(renderer) SDL_h_2.SDL_SetRenderDrawColor(renderer, 0.toByte(), 0.toByte(), 255.toByte(), 255.toByte()) SDL_h_2.SDL_RenderFillRect(renderer, rect) SDL_h_2.SDL_RenderPresent(renderer) } SDL_h_2.SDL_DestroyRenderer(renderer) SDL_h_3.SDL_DestroyWindow(window) } }
首先這里創(chuàng)建了一個窗口和渲染器,還渲染了一個矩形。之后做了事件處理,關閉的時候跳出循環(huán),之后銷毀窗口和渲染器。按下鍵盤上下左右鍵可以移動矩形。
之后調用./gradlew run
就可以運行程序了。
到此這篇關于Java使用FFM API調用SDL詳解的文章就介紹到這了,更多相關Java FFM調用SDL內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?JPA?deleteInBatch導致StackOverflow問題
這篇文章主要介紹了Spring?JPA?deleteInBatch導致StackOverflow問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Java while(scanner.hasNext())無法跳出的解決方案
這篇文章主要介紹了Java while(scanner.hasNext())無法跳出的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Spring Boot 中的自動配置autoconfigure詳解
這篇文章主要介紹了Spring Boot 中的自動配置autoconfigure詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01springboot+quartz以持久化的方式實現定時任務的代碼
這篇文章主要介紹了springboot+quartz以持久化的方式實現定時任務的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07