#include
#include
#include"com.coship.coshare.domain.MouseUtils.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "input.h"
#include "uinput.h"
#define die(str, args...) do { perror(str); exit(EXIT_FAILURE); } while(0);
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
int fd;
struct uinput_user_dev uidev; // uInput device structure
JNIEXPORT void JNICALL Java_com_coship_coshare_domain_MouseUtils_mouse_1clck
(JNIEnv * env, jobject obj , jint type, jint code , jint value )
{
simulate_mousesingleclick(fd);
}
JNIEXPORT void JNICALL Java_com_coship_coshare_domain_MouseUtils_mouse_1move
(JNIEnv *env, jobject obj , jint type , jint value_x , jint value_y)
{
simulate_mouse(fd, value_x, value_y);
}
JNIEXPORT void JNICALL Java_com_coship_coshare_domain_MouseUtils_mouse_1open
(JNIEnv *env, jobject obj)
{
fd = setup_uinput_device();
if(fd <= 0)
{
LOGI("error open keyboard:\n");
return;
}
}
JNIEXPORT void JNICALL Java_com_coship_coshare_domain_MouseUtils_mouse_1close
(JNIEnv *env, jobject obj)
{
close_mouse_device();
}
void close_mouse_device()
{
close(fd);
}
void simulate_mouse(int fd, int value_x, int value_y)
{
struct input_event event;
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
event.code = REL_X;
event.value = value_x;
write(fd, &event, sizeof(event));
event.type = EV_REL;
event.code = REL_Y;
event.value = value_y;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
/******************************************
模拟鼠标点击
*****************************************/
void simulate_mousesingleclick(int fd)
{
struct input_event event;
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = BTN_LEFT;
event.value = 1;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
event.type = EV_KEY;
event.code = BTN_LEFT;
event.value = 0;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
/***************************
打开鼠标
***************************/
int setup_uinput_device()
{
int i=0;
// Open the input device
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fd < 0)
{
die("error: open /dev/uinput");
}
memset(&uidev, 0, sizeof(uidev)); // Intialize the uInput device to NULL
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-Openkk");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1;
uidev.id.product = 0x1;
uidev.id.version = 1;
// Setup the driver I/O channels
ioctl(fd, UI_SET_EVBIT, EV_KEY);
ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
for (i=0; i < 256; i++)
{
ioctl(fd, UI_SET_KEYBIT, i);
}
ioctl(fd, UI_SET_EVBIT, EV_REL);
ioctl(fd, UI_SET_RELBIT, REL_X);
ioctl(fd, UI_SET_RELBIT, REL_Y);
/* Create input device into input sub-system */
write(fd, &uidev, sizeof(uidev));
if(ioctl(fd, UI_DEV_CREATE) < 0)
{
die("error: create uinput device");
LOGI("error: create uinput device");
}
return fd;
}
如上就是在Android下实现模拟鼠标的简单思路了,至于怎么将手机客户端的相关命令发送到Android下的TV端然后再模拟鼠标这个的方法就老多了,譬如可以通过网络啊通过蓝牙啊。这些东西就不在我讨论的范围之内了。我这里只是提供了一个简单思路。