1

在android中,我使用sendevent来模拟点击和拖动事件。代码是:

String[] events = new String[7];
events[0] = "sendevent /dev/input/event1 3 57 0";
events[1] = "sendevent /dev/input/event1 3 53 " + x1;
events[2] = "sendevent /dev/input/event1 3 54 " + y1;
events[3] = "sendevent /dev/input/event1 3 58 31";
events[4] = "sendevent /dev/input/event1 3 50 2";
events[5] = "sendevent /dev/input/event1 0 2 0";
events[6] = "sendevent /dev/input/event1 0 0 0";
Process suProcess = Runtime.getRuntime().exec("su");  
DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());  
for (String event : events) {
    os.writeBytes(event + "\n");
    os.flush();
}

是的,它可以达到结果,但是它非常慢且不稳定,每个sendevent都会新一个进程来执行它。

然后我在https://www.assembla.com/code/android-gb-for-sharp-is01/git/nodes/debug/system/core/toolbox/sendevent.c中找到 sendevent 源,它由 c 编写,并且每次它会打开一个文件并写入args,它每次都会创建一个新进程,所以我有一个想法,将sendevent重写为Java并直接在android代码中使用,它只需要打开一次文件并写入所有args .

可行吗?它可以加速我的代码吗?

4

1 回答 1

1

是的,这是可行的,您需要模拟表示 input_event 结构的字节序列并将其写入名为/dev/input/event1. 它应该会大大加快您的代码速度,因为脱壳是一项非常昂贵的操作。

这个问题(Using C struct in Java)有很多关于 C structs 和 Java 之间合作的有用信息。

顺便说一句,与此同时,我查看了Preon(我不知道那个库),它看起来真的很棒。下次我必须弄乱低级电报时,我一定会尝试一下!

于 2013-09-17T11:33:54.067 回答