api-impl: implement accelerometer support, no backend yet

currently x,y,z values are hardcoded and can only be changed with gdb
This commit is contained in:
Mis012
2024-03-16 15:04:02 +01:00
parent 6443e3977c
commit 20b179387b
7 changed files with 80 additions and 4 deletions

View File

@@ -0,0 +1,21 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class android_hardware_SensorManager */
#ifndef _Included_android_hardware_SensorManager
#define _Included_android_hardware_SensorManager
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: android_hardware_SensorManager
* Method: register_accelerometer_listener_native
* Signature: (Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V
*/
JNIEXPORT void JNICALL Java_android_hardware_SensorManager_register_1accelerometer_1listener_1native
(JNIEnv *, jobject, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,40 @@
#include <libportal/portal.h>
#include "../defines.h"
#include "../util.h"
#include "../generated_headers/android_hardware_SensorManager.h"
/* FIXME */
float x = 0;
float y = 2;
float z = 0;
struct accel_callback_data { JavaVM *jvm; jobject listener; jclass listener_class; jobject sensor; };
gboolean on_accel_data(struct accel_callback_data *d)
{
JNIEnv *env;
(*d->jvm)->GetEnv(d->jvm, (void**)&env, JNI_VERSION_1_6);
jfloatArray values = (*env)->NewFloatArray(env, 3);
(*env)->SetFloatArrayRegion(env, values, 0, 3, (jfloat[]){x, y, z});
jobject sensor_event = (*env)->NewObject(env, handle_cache.sensor_event.class, handle_cache.sensor_event.constructor, values, d->sensor);
(*env)->CallVoidMethod(env, d->listener, _METHOD(d->listener_class, "onSensorChanged", "(Landroid/hardware/SensorEvent;)V"), sensor_event);
return G_SOURCE_CONTINUE;
}
JNIEXPORT void JNICALL Java_android_hardware_SensorManager_register_1accelerometer_1listener_1native(JNIEnv *env , jobject this, jobject listener, jobject sensor)
{
JavaVM *jvm;
(*env)->GetJavaVM(env, &jvm);
struct accel_callback_data *callback_data = malloc(sizeof(struct accel_callback_data));
callback_data->jvm = jvm;
callback_data->listener = _REF(listener);
callback_data->listener_class = _REF(_CLASS(callback_data->listener));
callback_data->sensor = _REF(sensor);
g_timeout_add(10, G_SOURCE_FUNC(on_accel_data), callback_data);
}

View File

@@ -85,6 +85,9 @@ void set_up_handle_cache(JNIEnv *env)
handle_cache.motion_event.class = _REF((*env)->FindClass(env, "android/view/MotionEvent"));
handle_cache.motion_event.constructor = _METHOD(handle_cache.motion_event.class, "<init>", "(IIFFJFF)V");
handle_cache.sensor_event.class = _REF((*env)->FindClass(env, "android/hardware/SensorEvent"));
handle_cache.sensor_event.constructor = _METHOD(handle_cache.sensor_event.class, "<init>", "([FLandroid/hardware/Sensor;)V");
handle_cache.canvas.class = _REF((*env)->FindClass(env, "android/graphics/Canvas"));
handle_cache.canvas.constructor = _METHOD(handle_cache.canvas.class, "<init>", "(JJ)V");

View File

@@ -37,6 +37,10 @@ struct handle_cache {
jclass class;
jmethodID constructor;
} motion_event;
struct {
jclass class;
jmethodID constructor;
} sensor_event;
struct {
jclass class;
jmethodID constructor;