mirror of
https://github.com/Takiiiiiiii/strato.git
synced 2025-07-17 08:46:39 +00:00
Implement Rumble Support for Controllers and Device Vibrators
This commit is contained in:
@ -6,12 +6,17 @@
|
||||
thread_local JNIEnv *env;
|
||||
|
||||
namespace skyline {
|
||||
JvmManager::JvmManager(JNIEnv *environ, jobject instance) : instance(instance), instanceClass(reinterpret_cast<jclass>(environ->NewGlobalRef(environ->GetObjectClass(instance)))), initializeControllersId(environ->GetMethodID(instanceClass, "initializeControllers", "()V")) {
|
||||
JvmManager::JvmManager(JNIEnv *environ, jobject instance) : instance(environ->NewGlobalRef(instance)), instanceClass(reinterpret_cast<jclass>(environ->NewGlobalRef(environ->GetObjectClass(instance)))), initializeControllersId(environ->GetMethodID(instanceClass, "initializeControllers", "()V")), vibrateDeviceId(environ->GetMethodID(instanceClass, "vibrateDevice", "(I[J[I)V")), clearVibrationDeviceId(environ->GetMethodID(instanceClass, "clearVibrationDevice", "(I)V")) {
|
||||
env = environ;
|
||||
if (env->GetJavaVM(&vm) < 0)
|
||||
throw exception("Cannot get JavaVM from environment");
|
||||
}
|
||||
|
||||
JvmManager::~JvmManager() {
|
||||
env->DeleteGlobalRef(instanceClass);
|
||||
env->DeleteGlobalRef(instance);
|
||||
}
|
||||
|
||||
void JvmManager::AttachThread() {
|
||||
if (!env)
|
||||
vm->AttachCurrentThread(&env, nullptr);
|
||||
@ -41,4 +46,20 @@ namespace skyline {
|
||||
void JvmManager::InitializeControllers() {
|
||||
env->CallVoidMethod(instance, initializeControllersId);
|
||||
}
|
||||
|
||||
void JvmManager::VibrateDevice(jint index, const std::span<jlong> &timings, const std::span<jint> &litudes) {
|
||||
auto jTimings = env->NewLongArray(timings.size());
|
||||
env->SetLongArrayRegion(jTimings, 0, timings.size(), timings.data());
|
||||
auto jAmplitudes = env->NewIntArray(amplitudes.size());
|
||||
env->SetIntArrayRegion(jAmplitudes, 0, amplitudes.size(), amplitudes.data());
|
||||
|
||||
env->CallVoidMethod(instance, vibrateDeviceId, index, jTimings, jAmplitudes);
|
||||
|
||||
env->DeleteLocalRef(jTimings);
|
||||
env->DeleteLocalRef(jAmplitudes);
|
||||
}
|
||||
|
||||
void JvmManager::ClearVibrationDevice(jint index) {
|
||||
env->CallVoidMethod(instance, clearVibrationDeviceId, index);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user