HarmonyOS 鸿蒙Next:native c++里怎么调用可执行文件

发布于 1周前 作者 nodeper 来自 鸿蒙OS

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());
}

3 回复

貌似目前不支持,ls这些权限限制的很严格,看后面沙箱演进可能会支持调用可执行文件。目前建议把“c++编译的程序”编译成静态或者动态库再去直接调用

感谢解答。这个程序还要调用其它的可执行程序,编译成库,需要改造的太多了。

在HarmonyOS鸿蒙Next系统中,从native C++代码中调用可执行文件通常涉及使用系统调用接口来执行外部程序。这可以通过标准C库函数system()或者更高级的exec系列函数(如execl, execp, execle等)来实现。

  1. 使用system()函数: 这是一个简单的方法,只需将要执行的命令作为字符串传递给system()。例如:

    #include <cstdlib>
    int main() {
        int result = system("path/to/executable");
        return result;
    }
    
  2. 使用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

回到顶部