android下面通过ndk建立一个虚拟触摸屏设备可以被sendevent调用
2016-11-21 19:25
1346 查看
如何创建
如何使用
如何编译
如何使用
如何编译
1 如何创建
#define LOG_TAG "shinevitualdevice" #if 0 #include <utils/Log.h> #endif #include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <linux/input.h> #include <linux/uinput.h> #include <time.h> #include <sys/time.h> #define LOGE printf // Globals static int uinp_fd = -1; static int uinp_acc_fd = -1; static int uinp_ori_fd = -1; // Setup the uInput device static int setup_uinput_device() { struct uinput_user_dev uinp; // uInput device structure int i; // Open the input device uinp_fd = open("/dev/uinput", O_WRONLY | O_NDELAY); if (uinp_fd == 0) { LOGE("Unable to open /dev/uinput\n"); return -1; } // Intialize the uInput device to NULL memset(&uinp, 0x00, sizeof(uinp)); strncpy(uinp.name, "ShineVirtualInputReceiver", sizeof(uinp.name)-1); uinp.id.vendor = 0x3697; uinp.id.product = 0x0003;//对应/system/usr/idc/Vendor_3697_Product_0003.idc //0x0010; uinp.id.bustype = BUS_VIRTUAL; // Setup the uInput device (Keyboard + Cursor + Single-touch + Multi-touch) ioctl(uinp_fd, UI_SET_EVBIT, EV_KEY); ioctl(uinp_fd, UI_SET_EVBIT, EV_REL); ioctl(uinp_fd, UI_SET_EVBIT, EV_ABS); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_POWER); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_MUTE); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_SLEEP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_AUDIO); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CAMERA); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_ZOOM); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNEL); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_0); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_1); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_2); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_3); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_4); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_5); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_6); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_7); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_8); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_9); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RED); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_GREEN); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_YELLOW); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_BLUE); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_MENU); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_BACK); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_EPG); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_UP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_DOWN); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_LEFT); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RIGHT); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_ENTER); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNELUP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNELDOWN); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_VOLUMEUP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_VOLUMEDOWN); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAGEUP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAGEDOWN); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_HOME); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_SUBTITLE); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RECORD); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_HELP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_INFO); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_LIST); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_REWIND); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FORWARD); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PREVIOUSSONG); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_NEXTSONG); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PLAY); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAUSE); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_STOP); ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F1); // MTS ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F2); // FREEZE ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F3); // TTX ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F4); // CC ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F5); // WINDOW ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F6); // TV_INPUT ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F1); // MSTAR_BALANCE ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F2); // MSTAR_END ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F3); // MSTAR_INDEX ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F4); // MSTAR_MIX ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F5); // MSTAR_HOLD ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F6); // MSTAR_UPDATE ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F7); // MSTAR_REVEAL ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F8); // MSTAR_SUBCODE ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F9); // MSTAR_SIZE ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F10); // MSTAR_CLOCK ioctl(uinp_fd, UI_SET_KEYBIT, BTN_MOUSE); ioctl(uinp_fd, UI_SET_KEYBIT, BTN_TOUCH); ioctl(uinp_fd, UI_SET_RELBIT, REL_X); ioctl(uinp_fd, UI_SET_RELBIT, REL_Y); ioctl(uinp_fd, UI_SET_ABSBIT, ABS_X); ioctl(uinp_fd, UI_SET_ABSBIT, ABS_Y); ioctl(uinp_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X); ioctl(uinp_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y); // Single-touch uinp.absmin[ABS_X] = 0; uinp.absmax[ABS_X] = 1920; uinp.absfuzz[ABS_X] = 0; uinp.absflat[ABS_X] = 0; uinp.absmin[ABS_Y] = 0; uinp.absmax[ABS_Y] = 1080; uinp.absfuzz[ABS_Y] = 0; uinp.absflat[ABS_Y] = 0; // Multi-touch uinp.absmin[ABS_MT_POSITION_X] = 0; uinp.absmax[ABS_MT_POSITION_X] = 1920; uinp.absfuzz[ABS_MT_POSITION_X] = 4; uinp.absflat[ABS_MT_POSITION_X] = 8; uinp.absmin[ABS_MT_POSITION_Y] = 0; uinp.absmax[ABS_MT_POSITION_Y] = 1080; uinp.absfuzz[ABS_MT_POSITION_Y] = 4; uinp.absflat[ABS_MT_POSITION_Y] = 8; // Create input device into input sub-system if (write(uinp_fd, &uinp, sizeof(uinp)) != sizeof(uinp)) { LOGE("First write returned fail.\n"); return -1; } if (ioctl(uinp_fd, UI_DEV_CREATE)) { LOGE("ioctl UI_DEV_CREATE returned fail.\n"); return -1; } return 1; }
static int setup_shine_uinput_device(void) { if (setup_uinput_device() < 0) { LOGE("Unable to find uInput device\n"); return -1; } return 0; }
2 如何使用
#include <errno.h> #include <pthread.h> #include <signal.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <android/log.h> #include <unistd.h> #include "jni.h" #define LOG_TAG "System.out" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define CURRENT_ENCODE "GBK" #define CURRENT_ENCODE_Q "UTF-8" int g_nMode = 1;//write //0: 0x1130, 0x0015);//TouchScreen 22cun //1: 0x265f, 0x0005);//TouchScreen 18.5cun //2: VID 23A4 0219 MingTai cardReader 2in1 unsigned int g_unTouchScreenVidPIdArray[16];// unsigned int g_unTouchScreenCurVidPid = 0; enum { MODE_INIT = 0x00, MODE_AWAIT_FINGER_ON = 0x10, MODE_AWAIT_FINGER_OFF = 0x12, MODE_CAPTURE = 0x20, MODE_SHUT_UP = 0x30, MODE_READY = 0x80, }; enum { STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1, STATE_AWAIT_IRQ_FINGER_DETECTED, STATE_AWAIT_MODE_CHANGE_CAPTURE, STATE_AWAIT_IMAGE, STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF, STATE_AWAIT_IRQ_FINGER_REMOVED, }; #if 1//20120807 byh #define covert(c1,c2) (unsigned int)((c1<<8)|(c2)) #else #define covert(c1,c2) (unsigned short)((c1<<8)|(c2)) #endif //#include <stdio.h> //#include <stdlib.h> #include <string.h> #include <stdint.h> #include <fcntl.h> #include <sys/ioctl.h> //#include <linux/input.h> // this does not compile #include <errno.h> // from <linux/input.h> #if 0 struct input_event { struct timeval time; unsigned short type; unsigned short code; int value; }; #endif #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ #define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11 #define KEY_A 30 #define KEY_B 48 #define KEY_C 46 #define KEY_D 32 #define KEY_E 18 #define KEY_F 33 #define KEY_X 64 #define KEY_ENTER 28 // end <linux/input.h> #include <android/log.h> #define LOG_TAG "System.out" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) /////////////////event5 begin/////////////////////////////////// #include "shineVirtualTouch.cpp" static int g_fdEvent5 = -1; void closeEvent5() { if(-1 != g_fdEvent5) { close(g_fdEvent5); g_fdEvent5 = -1; } } int queryShineVirtualInputReceiver() { int fd = -1; char name[256]= "Unknown"; char eventname[256]; int i=0; for(i=0;i<20;i++) { memset(eventname, 0, sizeof(eventname)); sprintf(eventname, "/dev/input/event%d", i); printf("eventname is %s\n", eventname); if ((fd = open(eventname, O_RDWR)) < 0) { perror("evdev open"); continue; } memset(name, 0, sizeof(name)); if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) { perror("evdev ioctl"); } printf("The device on %s says its name is %s\n", eventname, name); if(0 == strcmp(name, "ShineVirtualInputReceiver")) { g_fdEvent5 = fd; int version; if (ioctl(g_fdEvent5, EVIOCGVERSION, &version)) { fprintf(stderr, "could not get driver version for %s, %s\n", eventname, strerror(errno)); g_fdEvent5 = -1; return g_fdEvent5; } break; } close(fd); } return 0; } int openEvent5(char *pEventPath) { int version; g_fdEvent5 = -1; queryShineVirtualInputReceiver(); return g_fdEvent5; } int sendevent(struct input_event &event) { int ret; static int nInit = 0; if(0 == nInit) { nInit = 1; setup_shine_uinput_device(); } if(-1 == g_fdEvent5) { #if 1//20131113 byh char *g_pEventUrl = "/dev/input/event5"; printf("before openEvent: %s\n", g_pEventUrl); openEvent5(g_pEventUrl); #else printf("before openEvent5\n"); openEvent5("/dev/input/event5"); #endif usleep(200*1000); } ret = write(g_fdEvent5, &event, sizeof(event)); if(ret < sizeof(event)) { fprintf(stderr, "write event failed, %s\n", strerror(errno)); return -1; } return 0; } /////////////for sendevent end/////////////////////////// static void input_report_key(struct input_dev *dev, unsigned int code, int value) { //printf("input_report_key code:%d value:%d\n", code, value); static struct input_event event; memset(&event, 0, sizeof(event)); event.type = 1; event.code = code; event.value = value; sendevent(event); } static void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { //printf("input_event type:%d code:%d value:%d\n", type, code, value); static struct input_event event; memset(&event, 0, sizeof(event)); event.type = type; event.code = code; #if 1//20140117 byh , scale at i2c recv data , do nothing event.value = value; #else if(ABS_MT_POSITION_X == code) { event.value = (value*1920)/1280; } else if(ABS_MT_POSITION_Y == code) { event.value = (value*1080)/800; } else { event.value = value; } #endif //printf("input_event type:%d code:%d value:%d event.value %d\n", type, code, value, event.value); sendevent(event); } static void input_mt_sync(struct input_dev *dev) { //printf("input_mt_sync \n"); static struct input_event event; memset(&event, 0, sizeof(event)); event.type = 0; event.code = 2; event.value = 0; sendevent(event); } static void input_sync(struct input_dev *dev) { //printf("input_sync \n"); static struct input_event event; memset(&event, 0, sizeof(event)); event.type = 0; event.code = 0; event.value = 0; sendevent(event); } /////////////////event5 end/////////////////////////////////// static int irt_WLZ_SINGLE_read_data(int x, int y, int touch) { printf("%s(%d) :2013-06-25 irt_WLZ_SINGLE_read_data : src x %d y %d x=%02x y=%02x dev->touch=%d \n", __FILE__, __LINE__, x, y, touch); struct input_dev *input = NULL; { if(1 == touch) { input_report_key(input, BTN_TOUCH, 1);//330 input_event(input, EV_ABS, ABS_MT_TRACKING_ID, 1); //57 input_event(input, EV_ABS, ABS_MT_POSITION_X, x+1);//53 input_event(input, EV_ABS, ABS_MT_POSITION_Y, y+1);//54 input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, 1);//48 input_mt_sync(input); input_sync(input); } else { input_report_key(input, BTN_TOUCH, 0); input_mt_sync(input); input_sync(input); } printf("%s(%d) :2013-06-25 irt_WLZ_SINGLE_read_data : src x %d y %d x=%02x y=%02x dev->touch=%d \n", __FILE__, __LINE__, x, y, touch); } return 1; } static int TouchScreen11300015() { uint16_t k; unsigned char data[1024]; int r; int i; int ret = -1; r=0; input_sync(NULL); memset(data, 0, sizeof(data)); //printf("i is %d\n", i); while(1) { memset(data, 0, sizeof(data)); sleep(5); //printf("recv data %d\n ",r); for (i=0;i<32 ;i++ ) { printf("0x%02x ",data[i]); } printf("ret is %d\n", ret); irt_WLZ_SINGLE_read_data(500, 500, 1); irt_WLZ_SINGLE_read_data(500, 500, 0); } return 0; } int main(int argc,char **argv) { TouchScreen11300015(); return 0; }
3 如何编译
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE := arm #LOCAL_MODULE := MT3Y-00-A3991UsbCard LOCAL_MODULE := shineVirtualTouchScreen LOCAL_SRC_FILES := dpfp_threaded.cpp #LOCAL_SRC_FILES := hello-jni.c dpfp_threaded1.c #LOCAL_LDLIBS:= -L$(LOCAL_PATH)/../../libxml2-2.9.0/obj/local/armeabi -lxml2 -L$(LOCAL_PATH)/../../hello-jni_temp/jni -lusb-1.0 LOCAL_C_INCLUDES := /home/shine/opt/android-ndk-r6b/platforms/android-9/arch-arm/usr/include \ /home/shine/opt/android-ndk-r6b/sources/cxx-stl/stlport/stlport ../include $(LOCAL_PATH)/include \ $(LOCAL_PATH)/../../com_shine_jni_zgl LOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIE LOCAL_LDLIBS:= \ $(LOCAL_PATH)/../../../sources/cxx-stl/stlport/libs/armeabi/libstlport_static.a \ -L$(LOCAL_PATH)/../jni -llog include $(BUILD_EXECUTABLE)
相关文章推荐
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
- Android SendEvent如何获取不同型号手机的触摸屏输入设备
- android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- android建立NDK项目调用jrtplib与pc机进行通讯
- android下面通过I2C TOOLS工具查看设备寄存器(S5PV210平台)
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- SSRS时可以通过参数来调用一个报表
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- android, 删除SD卡音乐文件。通过getContentResolver读取音乐文件,可以获取到一个完整的路径,直接new File(这括号写获取的路径).delete();
- 请写一个过程,可以向 book 表添加书,要求通过 java 程序调用该过程。
- javascript for java:一个可以让用户通过JAVA调用JAVASCRIPT的JAVA包
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- android下面通过I2C TOOLS工具查看设备寄存器(S5PV210平台)
- 一个嵌入式web服务器项目,实现通过手机Android App实现对嵌入式设备的控制
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- 一个网站基本完工后,需要通过下面三步测试才可以交活