【问题标题】:Rewrite sendevent.c from C to Java将 sendevent.c 从 C 重写为 Java
【发布时间】:2013-09-17 19:53:31
【问题描述】:

在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代码中使用,只需要打开一次文件并写入所有参数。

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

【问题讨论】:

    标签: java android c rewrite


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不想用 Preon,它看起来很大,用 java api 可能会更好。我用java写了一个简单的类。看到gist.github.com/Yhzhtk/6595875,我不确定它是否正确,明天我会测试它。谢谢!
    • @Yhzhtk 使用 nio 确实是另一种非常合理的方法,起初我没有看到您的代码有任何严重问题,可能存在字节顺序(字节序)问题,但这应该很容易调试并且正确。顺便说一句,如果您能在您的平台上发布使用此解决方案获得的速度提升,我将不胜感激。
    • 我在android中运行时出现错误java.io.IOException: write failed: EINVAL (Invalid argument)。这是一个字节顺序问题。如何获得正确的结构字节顺序?我不会写c,struct对我来说是个问题。
    • 我有更新时间字节长度,然后没有出现错误Invalid argument,但我无法获取发送事件。我发现Source 在写入之前有一个调用 ioctl(fd, EVOCGVERSION, &version),它说获取驱动程序版本,我是否应该在写入之前使用它以及如何在 Java 中使用ioctl,或者我不应该使用 FileOutputStream写入数据。
    • 我认为最好从一个新问题重新开始,以当前状态为起点,我们离最初的问题还很远。现在,我认为您实际上必须执行该ioctl,如果您真的必须it's not easy
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多