在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
相关产品推荐
相关产品推荐

