android 上层使用uinput 的用法来模拟 input 事件
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/types.h>
#include <termios.h>
#include <time.h>
#include <pthread.h>
#include <hardware_legacy/power.h>
#include <utils/Log.h>#include <fcntl.h>
#include <errno.h>
#include <cutils/log.h>
#include <cutils/atomic.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"#define LOG_TAG "UINPUT"
#include <utils/Log.h> //all Android LOG macros are defined here.#define SHIFT   (1 << 16)
int                    fd;int keyboard_init(void)
{struct uinput_user_dev uidev;//struct input_event     ev;int                    i;fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);if(fd <= 0) {ALOGI("error: open");return -1;} else {ALOGI("open /dev/uinput fd = %d\n", fd);}memset(&uidev, 0, sizeof(uidev));snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "wade_remote");uidev.id.bustype = BUS_USB;uidev.id.vendor  = 0x1;uidev.id.product = 0x1;uidev.id.version = 1;// config uinput device Keyboardioctl(fd, UI_SET_EVBIT, EV_KEY);for (i = 0; i < 128; i++) {ioctl(fd, UI_SET_KEYBIT, i);usleep(10000);}if(write(fd, &uidev, sizeof(uidev)) < 0) {ALOGI("error: write");return -1;}if(ioctl(fd, UI_DEV_CREATE) < 0) {ALOGI("error: ioctl");return -1;}return fd;
}int keyboard_release(int fd)
{if (fd <= 0)return -1;if(ioctl(fd, UI_DEV_DESTROY) < 0)ALOGI("error: ioctl");close(fd);return 0;
}int keyboard_write(int fd, const char key, bool up_down)
{struct input_event event;const unsigned short key_code = (unsigned short) key;if (fd <= 0) {ALOGI("open fd <= 0 error!\n");return -1;}// key downif (up_down == 0){ALOGI("key down \n");memset(&event, 0, sizeof(event));gettimeofday(&event.time, 0);event.type = EV_KEY;event.value = 1;event.code = key_code;if (write(fd, &event, sizeof(event)) < 0)return -1;}// key upif (up_down == 1){ALOGI("key up \n");memset(&event, 0, sizeof(event));gettimeofday(&event.time, 0);event.type = EV_KEY;event.value = 0;event.code = key_code;if (write(fd, &event, sizeof(event)) < 0)return -1;// sync//edit by Wade when key up send synALOGI("key sync \n");event.type = EV_SYN;event.value = 0;event.code = SYN_REPORT;if (write(fd, &event, sizeof(event)) < 0)return -1;}return 0;
}static int native_ukeyreport(JNIEnv *env, jobject thiz,int key_value, bool up_down)
{if (fd < 1) {ALOGI("ukeyreport  failed!------,type=%d,open=%d",key_value, up_down);return -EFAULT;}int ret = keyboard_write(fd, key_value, up_down);return ret;
}//=======================================================================static const char *classPathName = "com/mgexample/bluetooth/remotecontrol/uinput";static JNINativeMethod methods[] = {{"ukeyreport", "(IZ)I", (void*)native_ukeyreport },//{"get_status", "(I)I", (void*)native_get_status },
};// ----------------------------------------------------------------------------/** This is called by the VM when the shared library is first loaded.*/jint JNI_OnLoad(JavaVM* vm, void* reserved)
{jint result = -1;JNIEnv* env = NULL;jclass clazz;ALOGI("JNI_OnLoad");if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {ALOGE("ERROR: GetEnv failed");goto bail;}fd = keyboard_init();if (fd <= 0) {ALOGE("ERROR: error: keyboard_init()");return -1;}result = JNI_VERSION_1_4;clazz = env->FindClass(classPathName);ALOGI("JNI_registerNatives");env->RegisterNatives(clazz,methods, sizeof(methods) / sizeof(methods[0]));ALOGI("JNI_registerNatives end");
bail:return result;
}//onUnLoad方法,在JNI组件被释放时调用
void JNI_OnUnload(JavaVM* vm, void* reserved){  ALOGE("call JNI_OnUnload ~~!!");if (fd > 0){keyboard_release(fd);}
}

代码见 https://github.com/pcwung/uinput_use

uinput 用法 android 上层使用uinput 的用法来模拟 input 事件相关推荐

  1. socket android用法,Android NDK中socket的用法以及注意事项分析

    与Java层中的套接字相比,本机层中的Socket可以选择更多的配置项,并获得关于当前拥塞状态的更准确的信息,那么 NDK中socket的用法以及注意事项分析,大家清楚吗?下文是爱站技术频道小编为大家 ...

  2. Android电子牌外接USB读卡器读取内容模拟键盘事件

    最近做了一个Android外接USB读卡器刷手环读取数据,模拟键盘输入事件的项目; 借鉴了https://github.com/githubRonda/BarcodeScanner 连接电子牌板子调试 ...

  3. 49.Android中各种Span的用法

    49.Android中各种Span的用法 Android中各种Span的用法 前言 SpannableStringBuilder URLSpan UnderlineSpan TypefaceSpan ...

  4. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  5. Android TabLayout(选项卡布局)简单用法实例分析

    本文实例讲述了Android TabLayout(选项卡布局)简单用法.分享给大家供大家参考,具体如下: 我们在应用viewpager的时候,经常会使用TabPageIndicator来与其配合.达到 ...

  6. android 继承listview,Android listView 继承ListActivity的用法

    Android listView 继承ListActivity的用法 在手机中经常有列表方式.如果Activity中只有唯⼀⼀个List(这也是通常的情况),可以继 承ListActivity来实现. ...

  7. android studio 导入包分不分动态静态,详解Android studio 动态fragment的用法

    fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment.第二个则是动态的fragment. 静态fragment直接在layout创建你想要的fragment的X ...

  8. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  9. android++日历示例,Android开发之日历CalendarView用法示例

    本文实例讲述了android开发之日历calendarview用法.分享给大家供大家参考,具体如下: 简介: 1.calendarview是安卓自带的一个日历控件 2.在主活动中 通过设置setond ...

最新文章

  1. 医工智能 创享未来—— “医工科研数据平台”与“医工结合科研创新支持计划”发布!...
  2. 使用mysqld --install命令时出现MSVCR120.dll文件丢失错误
  3. 主从切换_“摸一摸”,乐在其中 | 雷柏i100蓝牙TWS耳机,主从切换,可单耳使用,也可双耳使用...
  4. visio网络拓扑图_人才测评模型是什么?5步了解好看模型图
  5. 红米Note 8 Pro新配色公布:轻盈一握宛若浮华在手
  6. 关于批处理的学习之二[显示篇]
  7. screenrecord 使用_Android使用screenrecord命令录制视频并制作GIF图片
  8. Pycharm 转化ui文件为py文件:报错Error in input file: not well-formed (invalid token): line 1, column 1
  9. MySQL图书借阅系统项目数据库建库表语句(组合主键、外键设置)
  10. 百度文库免财富值下载漏洞
  11. 国内最新Unity3D视频教程合辑
  12. 关于TypeError: e[h] is not a function的问题
  13. “挖矿2.0”:资本方不是只能割区块链的韭菜
  14. pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm
  15. 投影仪问题Debug
  16. 直接数字下变频(3):希尔伯特变换法
  17. 家电售后服务外包维修模式,该如何管理
  18. VUE图片裁剪组件,基于VueCropper
  19. JS--JavaScript数据类型(数值、字符串、布尔值)详解
  20. 学习「线性代数」看哪篇?推荐这篇,超级棒!

热门文章

  1. 爆炸了!刚刚!小姐姐说她找了个程序员男友
  2. 当过爱因斯坦助理,参加过曼哈顿计划,他还发明受欢迎的编程语言 | 人物志...
  3. 相比 C 、C++,Go 为什么不火?
  4. 华米OV 万亿 IoT 争夺战
  5. 社会关系分析_肯德基加盟费分析!肯德基加盟流程!肯德基加盟条件2021
  6. linux去重统计个数,linux 文件内容查找、去重、统计(示例代码)
  7. java jdbc jar包_大数据从入门到深入:JavaEE 之 数据库技术 JDBC(1)
  8. php 打包下载网络图片,php多张图片打包下载
  9. toad可以连接mysql吗_配置Toad链接远程Oracle数据库
  10. java easyui条件组合查询_EasyUi+Spring Data 实现按条件分页查询