HarmonyOS 鸿蒙Next:native c++里怎么调用可执行文件
HarmonyOS 鸿蒙Next:native c++里怎么调用可执行文件
已有一个c++编译的程序,在Android里通过Runtime.getRuntime ().exec ()调用。现在计划迁移到Harmony OS next中。
Arkts没有对应功能,现在尝试native c++里调用命令行,但是包括系统命令(‘ls’, ‘cd’)都是报permission denied. 可执行文件应该放什么目录下?
需要申请什么权限?
std::array<char, 128> buffer;
std::string result;
//std::string command = "ls"
std::string command = “/system/bin/sh /data/local/tmp/test.sh”;
std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(command.c_str(), “r”), pclose);
if (!pipe) {
const char *e = strerror(errno);
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, “Init”, “error %{public}s”, e);
} else {
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += buffer.data();
}
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, “Init”, “result %s”, result.data());
}
貌似目前不支持,ls这些权限限制的很严格,看后面沙箱演进可能会支持调用可执行文件。目前建议把“c++编译的程序”编译成静态或者动态库再去直接调用
感谢解答。这个程序还要调用其它的可执行程序,编译成库,需要改造的太多了。
在HarmonyOS鸿蒙Next系统中,从native C++代码中调用可执行文件通常涉及使用系统调用接口来执行外部程序。这可以通过标准C库函数system()
或者更高级的exec
系列函数(如execl
, execp
, execle
等)来实现。
-
使用
system()
函数: 这是一个简单的方法,只需将要执行的命令作为字符串传递给system()
。例如:#include <cstdlib> int main() { int result = system("path/to/executable"); return result; }
-
使用
exec
系列函数: 这些方法提供了更精细的控制,比如设置环境变量、重定向标准输入输出等。它们通常用于替换当前进程映像。例如,使用execlp
:#include <unistd.h> int main() { char *args[] = {"path/to/executable", NULL}; execlp("path/to/executable", (char *)NULL); // 如果execlp返回,说明执行失败 perror("execlp failed"); return 1; }
请注意,调用外部可执行文件时需确保路径正确且具有执行权限。此外,还需考虑安全性问题,如命令注入攻击。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html