如何在Android上的本机C代码中使用系统函数中的cp(复制)命令

时间:2012-03-21 16:37:26

标签: android c linux android-ndk

我想在我的本机C程序中将文件从on目录复制到另一个目录。 我尝试使用system函数,但它无效。

我在Android的本机代码中尝试了此代码

int result = system("cp /mnt/test /Download/"); // It's not working

此系统函数返回256(错误代码)整数值。所以我们可以说系统功能在Android中运行。我还安装了BusyBox,所以我也可以使用cp命令。

如果我直接执行cp /mnt/test /Download/命令,那么它工作正常。

那么system函数中的问题是什么。我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

system()函数返回非零值表示命令处理器可用,如果没有,则返回零。您可以使用 sys / wait.h 中定义的宏来分析返回值。另外 system()实际上使用默认( sh )命令interperter调用 fork() syscall和 execl() 。因此,如果您的程序在调用 system()后立即退出,请考虑使用 waitpid()函数。

答案 1 :(得分:0)

可能是路径问题。尝试指定busybox“cp”命令的完整路径,如下所示:

int result = system("/path/to/bbdir/cp /mnt/test /Download/"); 

我不确定busybox保存文件的位置,所以只需更改“/ path / to / bbdir”即可反映您的实际busybox路径。

答案 2 :(得分:0)

我猜你的问题源于glibc中没有“cp”函数调用的事实。

如果您只需要复制文件,只需打开两个文件并开始复制;-) 实现cp的教科书示例通常以逐字节复制开始,然后移动到块复制,最后使用mmap()实现文件复制。

如果您需要其他功能,如保留符号链接等,代码的复杂性会迅速增加。

在这种情况下,想要使用system()可能很诱人。 但是,在Android上,只有少数系统随busybox一起提供。 大多数系统仍然附带原始Android'工具箱'。这个在它提供和可以做的事情上非常有限。

顺便说一句,如果'cp'不起作用且您确定您有busybox,请尝试'/ bin / busybox cp'。