2017-01-19 90 views
7

我无法在Android平台上通过QProcess运行任何命令。我正在使用Qt库。任何人都可以解释如何从Android平台上的应用程序运行shell命令?在Android平台上通过QProcess运行shell命令

QProcess process(); 

    process.execute("ls"); 

    bool finished = process.waitForFinished(-1); 

    qDebug() << "End : " << finished << " Output : " << process.errorString(); 

如果我没有指定超时,则进程没有完成。当我指定超时时,process.waitForFinished()返回false假设10000毫秒。

+0

任何人都可以帮助吗? – ArnesTwin

+0

你能解释什么是错的吗?像过程完成后,'QProcess :: error()','errorString()','exitCode()','exitStatus()'等等的值是什么。 –

+0

它没有完成,只是等待 – ArnesTwin

回答

5

你的示例代码出现故障,它不会在任何平台上运行! ls命令不是一个确切的!该命令被构建到一个shell程序中,例如bash

您代码中的另一个错误是QProcess::executestatic function。 因此最后一行对您尝试启动的进程没有影响。

所以,你的代码应该是这样的:

QProcess process; 
process.start("bash", QStringList() << "-c" << "ls"); 

bool finished = process.waitForFinished(-1); 
+0

我试着用process.start(“bash”,QStringList()<<“-c”<<“ls”);但它并没有结束。它在ubuntu上运行没有问题,但它不能运行在android – ArnesTwin

+0

问题是:Android是否有'bash'?用'adb'检查。如果它具有它:你有能力运行它(如果需要的话)?现在您应该查看日志并查看打印的错误信息类型。 –

+0

'ls'sis不是内置函数,请参阅bash文档:https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html –

0

您正在使用QProcess::execute()这是一个静态函数。引用Qt documentation:“在新进程中启动程序命令,等待它完成”。

那么,在你的代码可能会出现的情况是:

QProcess process(); 

process.execute("ls"); // Start "ls" and wait for it to finish 
// "ls" has finished 
bool finished = process.waitForFinished(-1); // Wait for the process to finish, but there is no process and you could get locked here forever... 

有2种方法来解决你的代码:

QProcess process(); 

process.start("ls"); // Start "ls" and returns 

bool finished = process.waitForFinished(-1); 

qDebug() << "End : " << finished << " Output : " << process.errorString(); 

QProcess::execute("ls"); 
+0

不幸的是,结果是一样的。它并没有结束,只是等待 – ArnesTwin

+0

我已经做了一些测试。 Qt似乎没有锁定等待一个不存在的过程,我给你的例子在桌面和Android上都能正常工作。问题可能只是“ls”不会停止。我曾在Debian上看到过一个进程正在访问文件系统并阻止其他进程访问它的情况,其他进程会被卡住。 –