Java使用FFM?API調(diào)用SDL詳解
首先我們需要?jiǎng)?chuàng)建一個(gè)Gradle項(xiàng)目,之后設(shè)置項(xiàng)目的JDK版本,設(shè)置為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)
}
接著我們?cè)诋?dāng)前目錄初始化git倉(cāng)庫(kù),之后需要添加一個(gè)子模塊。、
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接口,之后運(yùn)行腳本,這樣就會(huì)在src/main/java生成SDL3的接口。
接著我們回到build.gradle.kts,添加application插件,之后將編譯好的路徑添加到啟動(dòng)參數(shù)中。
plugins {
application
}
application {
mainClass = "MainKt"
applicationDefaultJvmArgs = listOf("-Djava.library.path=SDL/build/Release", "--enable-native-access=ALL-UNNAMED")
}
之后就可以調(diào)用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)建了一個(gè)窗口和渲染器,還渲染了一個(gè)矩形。之后做了事件處理,關(guān)閉的時(shí)候跳出循環(huán),之后銷毀窗口和渲染器。按下鍵盤上下左右鍵可以移動(dòng)矩形。
之后調(diào)用./gradlew run就可以運(yùn)行程序了。

到此這篇關(guān)于Java使用FFM API調(diào)用SDL詳解的文章就介紹到這了,更多相關(guān)Java FFM調(diào)用SDL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法
下面小編就為大家分享一篇java 判斷一個(gè)數(shù)組中的數(shù)值是否連續(xù)相鄰的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Java靜態(tài)static與實(shí)例instance方法示例
這篇文章主要為大家介紹了Java靜態(tài)static與實(shí)例instance方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
java實(shí)現(xiàn)對(duì)服務(wù)器的自動(dòng)巡檢郵件通知
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)對(duì)服務(wù)器的自動(dòng)巡檢郵件通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Java中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式的相關(guān)算法原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03
SpringBoot中的6種API請(qǐng)求參數(shù)讀取方式總結(jié)
使用Spring Boot開(kāi)發(fā)API的時(shí)候,讀取請(qǐng)求參數(shù)是服務(wù)端編碼中最基本的一項(xiàng)操作,Spring Boot中也提供了多種機(jī)制來(lái)滿足不同的API設(shè)計(jì)要求,通過(guò)本文,為大家總結(jié)6種常用的請(qǐng)求參數(shù)讀取方式,需要的朋友可以參考下2024-07-07

