85 lines
2.9 KiB
C++
85 lines
2.9 KiB
C++
//
|
|
// Created by JIBUM HAN on 2026. 4. 9..
|
|
//
|
|
#include <jni.h>
|
|
#include <android/native_window_jni.h>
|
|
#include "PlayerEngine.h"
|
|
|
|
// 기존 월페이퍼 코드 어딘가에 있는 전역 JavaVM 포인터를 가져다 씁니다.
|
|
extern JavaVM* g_vm;
|
|
|
|
// C++ 객체를 포인터로 변환하는 헬퍼 함수
|
|
template<typename T>
|
|
T* toPlayerNative(jlong handle) {
|
|
return reinterpret_cast<T*>(handle);
|
|
}
|
|
|
|
extern "C" {
|
|
|
|
JNIEXPORT jlong JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeInit(JNIEnv *env, jobject thiz) {
|
|
// 엔진 생성 시 JavaVM과 Kotlin 콜백 객체(thiz)를 전달합니다.
|
|
PlayerEngine* engine = new PlayerEngine(g_vm, thiz);
|
|
return reinterpret_cast<jlong>(engine);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeSeekBy(JNIEnv *env, jobject thiz, jlong handle, jdouble seconds) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) engine->seekBy(seconds);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeSetSpeed(JNIEnv *env, jobject thiz, jlong handle, jfloat speed) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) engine->setSpeed(speed);
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeSetDataSource(JNIEnv *env, jobject thiz, jlong handle, jint videoFd, jstring jSubPath) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) {
|
|
const char* subPath = env->GetStringUTFChars(jSubPath, nullptr);
|
|
|
|
// 엔진으로 FD 번호를 전달
|
|
engine->setDataSource(videoFd, subPath);
|
|
|
|
env->ReleaseStringUTFChars(jSubPath, subPath);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativePause(JNIEnv *env, jobject thiz, jlong handle) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) {
|
|
engine->pause(); // 💡 세미콜론 추가
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativePlay(JNIEnv *env, jobject thiz, jlong handle, jobject surface) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine && surface) {
|
|
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
|
|
// RGBA 포맷으로 버퍼 설정
|
|
ANativeWindow_setBuffersGeometry(window, 0, 0, WINDOW_FORMAT_RGBX_8888);
|
|
engine->play(window);
|
|
ANativeWindow_release(window);
|
|
}
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeStop(JNIEnv *env, jobject thiz, jlong handle) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) engine->stop();
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_bums_lunatic_launcher_player_NativePlayer_nativeDestroy(JNIEnv *env, jobject thiz, jlong handle) {
|
|
PlayerEngine* engine = toPlayerNative<PlayerEngine>(handle);
|
|
if (engine) delete engine;
|
|
}
|
|
|
|
} |