You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android原生C++代码中调用adb命令并获取字符串格式返回结果

问题根源

你当前的代码存在两个核心错误:

  • 命令调用逻辑错误:adb是电脑端和Android设备通信的调试工具,你直接在Android应用的原生代码里调用adb shell是完全不成立的,应用运行在Android系统内部,根本找不到adb可执行文件,system返回127就是找不到指定执行命令的典型返回值,你要执行的目标命令本身就是pwd,不需要加adb shell前缀。
  • 接口用法错误:system()函数的返回值仅代表命令的退出状态码,完全不会捕获命令的标准输出内容,你要获取命令的执行输出,需要使用popen()函数读取命令的输出流。

修正后的完整实现代码

#include <jni.h>
#include <string>
#include <cstdio>
#include <sys/wait.h> // 用于WEXITSTATUS宏解析返回状态

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_adb_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    char read_buff[1024];
    std::string cmd_output;
    // 执行pwd命令,r参数表示只读命令的标准输出
    FILE* cmd_pipe = popen("pwd", "r");
    if (!cmd_pipe) {
        return env->NewStringUTF("Failed to run command");
    }
    // 循环读取命令输出到字符串
    while (fgets(read_buff, sizeof(read_buff), cmd_pipe) != nullptr) {
        cmd_output += read_buff;
    }
    // 关闭管道,获取命令执行状态
    int exit_status = pclose(cmd_pipe);
    if (exit_status == -1) {
        return env->NewStringUTF("Failed to close pipe");
    }
    // 可选:把命令退出状态也拼接到返回结果
    char status_buff[64];
    snprintf(status_buff, sizeof(status_buff), "\nCommand exit code: %d", WEXITSTATUS(exit_status));
    cmd_output += status_buff;

    return env->NewStringUTF(cmd_output.c_str());
}

额外注意事项

  • Android高版本(10及以上)对应用执行shell命令的权限有更严格的限制,如果你要执行的是需要系统权限的命令,需要确保应用已经申请到了对应的权限。
  • 如果需要执行带参数的命令,直接完整写入popen的第一个参数即可,比如要列出当前目录下的文件,就写popen("ls -l", "r")。

内容的提问来源于stack exchange,提问作者Hasan A Yousef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:54:02