在Android中通过C代码执行命令

在Android中通过C代码执行命令,android,c,android-ndk,Android,C,Android Ndk,我想在C中执行屏幕截图命令“adb shell/system/bin/screencap-p/sdcard/img.png”。我搜索了相同的命令,得到并修改了命令 execl("/system/bin/screencap", "-p", "storage/sdcard0/screenShot.png", (char *)NULL); 但当我运行应用程序并调用上述命令的方法时,应用程序就会崩溃 如何修改“/system/bin/screencap-p/sdcard/img.png”命令以从C代码

我想在C中执行屏幕截图命令“adb shell/system/bin/screencap-p/sdcard/img.png”。我搜索了相同的命令,得到并修改了命令

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
调用是

execl(path, arg0, arg1, ..., (char*) NULL);
第二个参数,
arg0
,是程序被告知用于调用它的名称。提供给程序的实际参数仅从
arg1
开始

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

execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);
execl(“/system/bin/screencap”,“screencap”,“-p”,“char*)NULL);
调用是

execl(path, arg0, arg1, ..., (char*) NULL);
第二个参数,
arg0
,是程序被告知用于调用它的名称。提供给程序的实际参数仅从
arg1
开始

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

execl("/system/bin/screencap", "screencap", "-p", "<pic>", (char *)NULL);
execl(“/system/bin/screencap”,“screencap”,“-p”,“char*)NULL);

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

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

为了避免这种情况,首先需要调用fork(),然后只在子对象中调用exec(),如下所示:

if (!fork()) {
    // fork() returned zero, so we are in the child
    execl...
}
在调用exec函数之前,可能还需要进行一些清理


但是请注意,大多数设备上的应用程序都无法截图,因为应用程序代码是在没有权限的用户id下运行的。但我似乎记得,在很短的一段时间内,有些设备在发货时没有对该功能进行权限检查,这是exec()系列函数的预期结果

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

为了避免这种情况,首先需要调用fork(),然后只在子对象中调用exec(),如下所示:

if (!fork()) {
    // fork() returned zero, so we are in the child
    execl...
}
在调用exec函数之前,可能还需要进行一些清理


但是请注意,大多数设备上的应用程序都无法截图,因为应用程序代码是在没有权限的用户id下运行的。但我似乎记得,在很短的一段时间内,有些设备在发货时没有对该功能进行权限检查,所以它可能会在这些方面起作用。

为什么不调用system()呢?我没听清楚。实际上,我想从C代码中运行屏幕截图命令。那么我在努力吗?我不确定excel()是否能实现这一点。如果你有任何想法和我分享..是用c。你能给我举个例子吗?@AndroidLearner你有没有试过像链接帖子中建议的那样在shell中运行它
execl(“/system/bin/sh”、“sh”、“-c”、“/system/bin/screencap-p storage/sdcard0/jni\u knox\u test.png”)
@tom直到。。。但正如Chris所说,我们不能截图大多数设备(只能在根设备上),那么可能该命令正在运行,但由于权限问题,无法给出结果。。我正在尝试并将更新您为什么不调用system()呢?我没有理解您。实际上,我想从C代码中运行屏幕截图命令。那么我在努力吗?我不确定excel()是否能实现这一点。如果你有任何想法和我分享..是用c。你能给我举个例子吗?@AndroidLearner你有没有试过像链接帖子中建议的那样在shell中运行它
execl(“/system/bin/sh”、“sh”、“-c”、“/system/bin/screencap-p storage/sdcard0/jni\u knox\u test.png”)
@tom直到。。。但正如Chris所说,我们不能截图大多数设备(只能在根设备上),那么可能该命令正在运行,但由于权限问题,无法给出结果。。我正在尝试并将更新你嗨,汤姆,我用了你的代码,但结果是一样的。应用程序正在关闭。你能告诉我关于
system()
plz
system(“/system/bin/screencap-p storage/sdcard0/jni\u knox\u test.png”)
,但我认为这不会给你带来不同的结果。system()至少应该避免崩溃,因为与exec系列不同,它对调用程序来说不是致命的。基本上,这个实现会让一个孩子执行这个命令,而家长会在孩子返回之前等待这个孩子终止。嘿,汤姆,你帮了我很多,但是克里斯更正确,这就是为什么我要接受这个答案。。。谢谢alotHi tom,我使用了你的代码,但结果是一样的。应用程序正在关闭。你能告诉我关于
system()
plz
system(“/system/bin/screencap-p storage/sdcard0/jni\u knox\u test.png”)
,但我认为这不会给你带来不同的结果。system()至少应该避免崩溃,因为与exec系列不同,它对调用程序来说不是致命的。基本上,这个实现会让一个孩子执行这个命令,而家长会在孩子返回之前等待这个孩子终止。嘿,汤姆,你帮了我很多,但是克里斯更正确,这就是为什么我要接受这个答案。。。非常感谢您的许可问题是正确的。这是我面临的一个主要问题,我无法知道是否执行了命令:(.是否有任何其他命令可以测试以验证命令是否正在运行?如果没有shell重定向,捕获输出是一件痛苦的事情,尽管您可以将文件作为stdout打开,然后执行“ls”或其他内容。或者您可以使用带有长参数列表的“am”来发送意图。可能您可以让一个“sh”坐在那里并在进程列表中检测它。我忘了你是否可以“设置”完全自定义的东西。编写自己的程序,用android本机日志函数记录hello world也是一个选项。可能有一个我没有想到的完美主意。有没有简单的