Включить adb с приложением Qt

Я использую Qt 5.3 на OS X. У меня есть программа, которая зависит от инструмента Android AdB, поэтому я пытаюсь включить его в качестве ресурса.

В моем файле проекта у меня есть:

RESOURCES = app.qrc

В app.qrc у меня есть:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>assets/adb</file>
</qresource>

В моем приложении:

QResource::registerResource("app.rcc");

// I've run with and w/o a compiled .rcc file. No difference.

QProcess *kill_adb=new QProcess;
    kill_adb->start("/assets/adb kill-server");
    kill_adb->waitForFinished(-1);
    int exitcode = kill_adb->exitCode();

    QString s = QString::number(exitcode);
    QMessageBox::critical(
     this,
     tr("exit code:"),
     s);
    delete kill_adb;

Звонки в /assets/adb не удаются. Если я использую путь к локальному ADB, код работает. Как я могу включить ADB с моей программой?

1 ответ

Решение

QProcess может выполнять только реальные файлы в вашей файловой системе. Вы не можете выполнить файл, если у вас нет файла.

Gnu / Linux, Windows, Android, Mac и т. Д. Могут выполнять файлы только в том случае, если они являются операционными системами на основе файловой системы. QProcess подчиняется этому, и это то, к чему он сводится, по крайней мере в Linux:

static inline int qt_safe_execve(const char *filename, char *const argv[],
                                 char *const envp[])
{
    int ret;
    EINTR_LOOP(ret, ::execve(filename, argv, envp));
    return ret;
}

static inline int qt_safe_execv(const char *path, char *const argv[])
{
    int ret;
    EINTR_LOOP(ret, ::execv(path, argv));
    return ret;
}

static inline int qt_safe_execvp(const char *file, char *const argv[])
{
    int ret;
    EINTR_LOOP(ret, ::execvp(file, argv));
    return ret;
}

Как видите, он будет вызывать разные варианты exec*, которые затем проходят через один и тот же системный вызов. Все они требуют имя файла.

Единственный способ сделать это без надлежащего установщика, предоставленного конечному пользователю прямо или косвенно, - это сначала прочитать содержимое и записать его во временный файл, если вы действительно хотите это сделать.

Тем не менее, я бы лично пошел на реальную установку установщика.

Другие вопросы по тегам