diff --git a/jni/evdev_reader/Android.mk b/jni/evdev_reader/Android.mk new file mode 100644 index 00000000..30898f5c --- /dev/null +++ b/jni/evdev_reader/Android.mk @@ -0,0 +1,12 @@ +# Android.mk for Limelight's Evdev Reader +MY_LOCAL_PATH := $(call my-dir) + +include $(call all-subdir-makefiles) + +LOCAL_PATH := $(MY_LOCAL_PATH) + +include $(CLEAR_VARS) +LOCAL_MODULE := evdev_reader +LOCAL_SRC_FILES := evdev_reader.c + +include $(BUILD_SHARED_LIBRARY) diff --git a/jni/evdev_reader/evdev_reader.c b/jni/evdev_reader/evdev_reader.c new file mode 100644 index 00000000..b26e62ec --- /dev/null +++ b/jni/evdev_reader/evdev_reader.c @@ -0,0 +1,65 @@ +#include +#include + +#include +#include +#include +#include +#include + +JNIEXPORT jint JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_open(JNIEnv *env, jobject this, jstring absolutePath) { + const char *path; + + path = (*env)->GetStringUTFChars(env, absolutePath, NULL); + + return open(path, O_RDWR); +} + +JNIEXPORT jboolean JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_grab(JNIEnv *env, jobject this, jint fd) { + return ioctl(fd, EVIOCGRAB, 1) == 0; +} + +JNIEXPORT jboolean JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_ungrab(JNIEnv *env, jobject this, jint fd) { + return ioctl(fd, EVIOCGRAB, 0) == 0; +} + +// isMouse() and friends are based on Android's EventHub.cpp + +#define test_bit(bit, array) (array[bit/8] & (1<<(bit%8))) + +JNIEXPORT jboolean JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_isMouse(JNIEnv *env, jobject this, jint fd) { + unsigned char keyBitmask[(KEY_MAX + 1) / 8]; + unsigned char relBitmask[(REL_MAX + 1) / 8]; + + ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keyBitmask)), keyBitmask); + ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relBitmask)), relBitmask); + + // If this device has all required features of a mouse, it's a mouse! + return test_bit(BTN_MOUSE, keyBitmask) && + test_bit(REL_X, relBitmask) && + test_bit(REL_Y, relBitmask); +} + +JNIEXPORT jint JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_read(JNIEnv *env, jint fd, jbyteArray buffer) { + jint ret; + jbyte *data = (*env)->GetByteArrayElements(env, buffer, NULL); + if (data == NULL) { + return -1; + } + + ret = read(fd, data, sizeof(struct input_event)); + + (*env)->ReleaseByteArrayElements(env, buffer, data, 0); + + return ret; +} + +JNIEXPORT jint JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_close(JNIEnv *env, jobject this, jint fd) { + return close(fd); +} diff --git a/libs/arm64-v8a/libevdev_reader.so b/libs/arm64-v8a/libevdev_reader.so new file mode 100755 index 00000000..b6a370b6 Binary files /dev/null and b/libs/arm64-v8a/libevdev_reader.so differ diff --git a/libs/armeabi-v7a/libevdev_reader.so b/libs/armeabi-v7a/libevdev_reader.so new file mode 100755 index 00000000..7498feed Binary files /dev/null and b/libs/armeabi-v7a/libevdev_reader.so differ diff --git a/libs/mips/libevdev_reader.so b/libs/mips/libevdev_reader.so new file mode 100755 index 00000000..a5c4d5f5 Binary files /dev/null and b/libs/mips/libevdev_reader.so differ diff --git a/libs/x86/libevdev_reader.so b/libs/x86/libevdev_reader.so new file mode 100755 index 00000000..bac220ce Binary files /dev/null and b/libs/x86/libevdev_reader.so differ diff --git a/libs/x86_64/libevdev_reader.so b/libs/x86_64/libevdev_reader.so new file mode 100755 index 00000000..e1f5cdd1 Binary files /dev/null and b/libs/x86_64/libevdev_reader.so differ