如何在Android SHELL中运行C++应用程序

10

我想运行用C++编写并使用Android工具链9编译的“hello world”程序,但是我遇到了一个问题:默认情况下我没有权限启动它,而且我无法使用chmod更改权限。

我使用的是Android 2.3.3 - API级别10

应用程序是为API级别9交叉编译器编译的

操作步骤:

编译应用程序:

~/toolchain_andr9/bin/ arm-linux-androideabi-g++ helloworld.cpp

然后将应用程序发送到模拟器上的SDCARD:

>adb push a.out /mnt/sdcard

然后转到SHELL并尝试运行a.out

>adb shell
> 
>/mnt/sdcard/a.out

结果为:

>`/mnt/sdcard/a.out: permission denied`

使用命令ls -l可以显示a.out文件的权限信息:

>`----rwxr-x system   sdcard_rw   863656 2012-04-12 22:42 a.out`

我试图更改权限:

>chmod 777 /mnt/sdcard/a.out

但是权利不会改变:

>`----rwxr-x system   sdcard_rw   863656 2012-04-12 22:42 a.out`

我觉得我在使用安卓时遗漏了一些重要的东西。

有没有人可以帮助我,并告诉我如何在 `Android SHELL` 中运行应用程序?

非常感谢。

P.S. 对不起我的英语 =)


你有root权限吗?没有root权限可能无法实现重点:http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App - user405725
1
尝试将您的文件放置在/data/local下,然后您应该能够对您的文件进行chmod操作。 - mgiza
2个回答

13

默认情况下,SD卡以noexec选项挂载,这禁止在卡上执行任何文件,无论它的权限是什么(即使是-rwxrwxrwx),因此您需要将文件移动到另一个位置,然后再执行它。

最简单的方法是将文件移动到/data/local/tmp/,然后使用完整路径(通常的POSIX路径语义)执行它。

> adb push a.out /data/local/tmp/a.out
> adb shell
> chmod 755 /data/local/tmp/a.out
> /data/local/tmp/a.out

这个操作不需要root权限,并且可以在重启生效


4
如果您已经root了手机,可以执行mount -o remount,rw /mnt/sdcard命令即可运行。我在我的Android手机上尝试过。

这个可行吗?有其他人尝试过吗?它是否会移除noexec标志?SD卡在重启后是否重新挂载?我曾经尝试过更改格式(vfat > ext2),结果让安卓系统非常生气。不得不使用newfs_msdos来修复它,所以我对更改SD卡持怀疑态度。 - Mark Mikofski
@MarkMikofski 这个在重启后不会保存,而且 sdcard 会在重启时正常挂载。 - Tianyang Li
太棒了,完全可以运行,它只是删除了“nosuid、nodev、noexec”标志! - Mark Mikofski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接