1

我想将屏幕截图命令执行"adb shell /system/bin/screencap -p /sdcard/img.png"到 C 中。我正在搜索相同的命令,我得到了另一个命令的解决方案,我将命令修改为

execl("/system/bin/screencap", "-p", "storage/sdcard0/screenShot.png", (char *)NULL);

但是当我运行我的应用程序并调用上述命令的方法时,应用程序会崩溃。

我应该如何修改“ /system/bin/screencap -p /sdcard/img.png”命令以从 C 代码运行。


汤姆回答后更新

应用程序再次关闭,这是日志

06-21 11:52:01.488: I/WindowState(279): WIN DEATH: Window{40fed2c0 u0 com.mytest.ndktestapplication/com.mytest.ndktestapplication.MainActivity}
06-21 11:52:01.498: I/ActivityManager(279): Process com.mytest.ndktestapplication (pid 7745) has died.
06-21 11:52:01.498: W/ActivityManager(279): Force removing ActivityRecord{40ea9ab8 u0 com.mytest.ndktestapplication/.MainActivity}: app died, no saved state
4

2 回答 2

3

这是 exec() 系列函数的预期结果。

他们所做的就是用指定的程序替换当前程序。所以再见应用程序。

为避免这种情况,您首先需要调用 fork(),然后仅在子进程中调用 exec(),如下所示:

if (!fork()) {
    // fork() returned zero, so we are in the child
    execl...
}

在调用 exec 函数之前,您可能还需要进行一些清理。

但是请注意,您将无法从大多数设备上的应用程序中截取屏幕截图,因为应用程序代码在没有权限的用户 ID 下运行。 但我似乎记得有一段时间,有些设备在未经许可的情况下发货时会检查此功能,因此它可能适用于这些功能。

于 2013-06-21T12:08:39.720 回答
1

调用是

execl(path, arg0, arg1, ..., (char*) NULL);

第二个参数arg0是程序被告知用于调用它的名称。给程序的实际参数仅从arg1.

因此,您应该将代码更改为

execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);
于 2013-06-21T11:45:08.470 回答