android jni方法模拟高频按键点击
16lz
2021-01-26
其实就是把sendevent的代码放到了jni层,这样速度很快,我用输入法试了一下,如果在android里执行sendevent命令发一个点击命令,从发送到上屏至少是800多ms,如果直接用jni调用也就10ms左右。
</pre><pre name="code" class="cpp">#include <jni.h>#include <errno.h>#include <fcntl.h>#include <linux/input.h>#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>extern "C" { JNIEXPORT int JNICALL Java_sogou_test_kpi_TestActivity_sendevent(JNIEnv * env, jobject obj,int argc, jobjectArray strArray);}JNIEXPORT int JNICALL Java_sogou_test_kpi_TestActivity_sendevent(JNIEnv * env,jobject obj,int argc, jobjectArray strArray){jstring jstr;jsize len = argc;char **argv = (char **) malloc(len*sizeof(char *));jsize i=0;for (i=0 ; i<len; i++) {jstr = (jstring)env->GetObjectArrayElement(strArray, i);argv[i] = (char *)env->GetStringUTFChars(jstr, 0);}argc = len; int fd; ssize_t ret; int version;struct input_event event; if(argc != 5) { close(fd);//fprintf(stderr, "use: %s device type code value\n", argv[0]); return 1; } fd = open(argv[1], O_RDWR); if(fd < 0) { close(fd);//fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno)); return 2; } if (ioctl(fd, EVIOCGVERSION, &version)) { close(fd);//fprintf(stderr, "could not get driver version for %s, %s\n", argv[optind], strerror(errno)); return 3; } memset(&event, 0, sizeof(event)); event.type = atoi(argv[2]); event.code = atoi(argv[3]); event.value = atoi(argv[4]); ret = write(fd, &event, sizeof(event)); if(ret < (ssize_t) sizeof(event)) { close(fd); //fprintf(stderr, "write event failed, %s\n", strerror(errno)); return -1; } close(fd); return 0;}
更多相关文章
- Android调用webservice接口
- Android电池驱动
- Android(安卓)Camera从App层到framework层到HAL层的初始化过程
- Android(安卓)SurfaceFlinger 学习之路(五)----VSync 工作原理
- EP28-DownloadManager分析(1)
- Android视图加载流程(3)之ViewRootImpl的UI刷新机制
- Android(安卓)内存溢出(Out Of Memory)
- Android(安卓)P wakeup 亮屏流程
- 004. Android界面刷新没有调用OnMeasure