2016-07-28 53 views
1

Ich versuche Cursor Maus auf Android mit/dev/uinput und ioctl bewegen.Android Mauszeiger Ereignis/dev/uinput bewegt sich nicht auf Y-Achse

Hier ist mein Code:

int fd = -1; 
struct input_event ev; 

int uinput_open_device() { 
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
if (fd < 0) { 
    __android_log_print(ANDROID_LOG_DEBUG, "Code C", "Failed to Open Event"); 
    return -1; 
} 
return fd; 
} 

int dev_uinput_init_mouse(char *name) { 
struct uinput_user_dev dev; 

fd = uinput_open_device(); 
if (fd > 0) { 
    ioctl(fd, UI_SET_EVBIT, EV_KEY); 
    ioctl(fd, UI_SET_KEYBIT, BTN_LEFT); 

    ioctl(fd, UI_SET_EVBIT, EV_REL); 
    ioctl(fd, UI_SET_RELBIT, REL_X); 
    ioctl(fd, UI_SET_RELBIT, REL_Y); 

    memset(&dev, 0, sizeof(dev)); 
    strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE); 

    dev.id.bustype = BUS_USB; 
    dev.id.vendor = 0x1; 
    dev.id.product = 0x1; 
    dev.id.version = 1; 

    if (write(fd, &dev, sizeof(dev)) < 0) { 
     __android_log_print(ANDROID_LOG_DEBUG, "Code C", "Failed to write"); 
     close(fd); 
    } 

    if (ioctl(fd, UI_DEV_CREATE) < 0) { 
     __android_log_print(ANDROID_LOG_DEBUG, "IOCTL", "Create Failed..."); 
     close(fd); 
     return -1; 
    } 
} 
return fd; 

void dev_uinput_sync(int fd) { 
memset(&ev, 0, sizeof(struct input_event)); 

ev.type = EV_SYN; 
ev.code = SYN_REPORT; 
ev.value = 0; 
if (write(fd, &ev, sizeof(struct input_event)) < 0) { 
    __android_log_print(ANDROID_LOG_DEBUG, "Code C", "Failed to write"); 
} else { 
    __android_log_print(ANDROID_LOG_DEBUG, "Code C", "Sync OK !"); 
} 
} 

void ptr_abs(int fd, int x, int y) { 
memset(&ev, 0, sizeof(struct input_event)); 
ev.type = EV_REL; 
ev.code = REL_X; 
ev.value = x; 
write(fd, &ev, sizeof(struct input_event)) 

memset(&ev, 0, sizeof(struct input_event)); 
ev.type = EV_REL; 
ev.code = REL_Y; 
ev.value = y; 
write(fd, &ev, sizeof(struct input_event); 
dev_uinput_sync(fd); 
} 

void dev_uinput_close(int fd) { 
ioctl(fd, UI_DEV_DESTROY); 
close(fd); 
} 

JNIEXPORT void JNICALL 
Java_com_example_hellojni_HelloJni_mouseSimulation(JNIEnv *env, jobject instance, jint absX, jint absY) { 
ptr_abs(fd, absX, absY); 
} 

JNIEXPORT void JNICALL 
Java_com_example_hellojni_HelloJni_openFD(JNIEnv *env, jobject instance) { 
dev_uinput_init_mouse("uinput-sample-test"); 
} 

JNIEXPORT void JNICALL 
Java_com_example_hellojni_HelloJni_closeFD(JNIEnv *env, jobject instance) { 
dev_uinput_close(fd); 
} 

All diese Funktionen durch einen Dienst in meiner Android-Anwendung aufgerufen werden. Die Funktion Java_com_example_hellojni_HelloJni_mouseSimulation(int Xaxis, int Yaxis) wird mit einem Wert für Xaxis und Yaxis aufgerufen, aber auf dem Bildschirm sehen wir, dass sich die Maus nur auf der X-Achse und nicht auf der Y-Achse bewegt.

Zum Beispiel, wenn ich Java_com_example_hellojni_HelloJni_mouseSimulation(200, 100) aufrufen, bewegt sich der Cursor 200 Pixel auf der X-Achse und nichts auf der Y-Achse.

Wie Sie die Bewegung sehen kann durch die Funktion ausgeführt wird void ptr_abs(int fd, int x, int y)

Die write auf die Funktion nicht ausfällt. Ich habe die Bewegung auf Y-Achse mit ioctl auf REL_Y Funktion aktiviert.

ich diesen Code auf Android API Kompilieren 19.

Vielen Dank für die Hilfe!

+0

Warum 'C' Tag verwenden? – VatsalSura

+1

Weil es ein C-Code ist? – DevAndroid

+0

Wird der Code kompiliert? Es sieht so aus, als ob Sie hier eine Klammer verpasst haben: write (fd, & ev, sizeof (struct input_event); (schreibt das Ereignis REL_Y) – samgak

Antwort

0

Das Problem ist gelöst ... ich jeden __android_log_print und der Zustand in jeder Schreibfunktion entfernt und es funktioniert ...

Seltsam ...