有时候有些命令需要用C代码写,编译成可执行程序放到Android系统里,结果不能运行,说找不到文件,而明明文件就在眼前。
有时候想运行一下系统编译出来的工具,结果说不能执行,Can't execute,而明明就具有执行权限。
这些问题,在很多情况下可以如下解决,而且解决起来居然就这么简单。
对于自己写的C代码,如test.c
#include <stdio.h>
int main() {
printf("OK");
return 0;
}
然后用gcc test.c –o test编译后放到Android系统去执行,报找不到文件的错误,因为你的程序是动态链接的。那么只要如此编译即可:
gcc test.c –o test –static
再放过去,是不是就可以执行了?当然有时候你还是得使用android提供的交叉编译工具去编译,而不仅仅是系统的gcc,如arm-none-linux-gnueabi-gcc
而对于第二个问题,使用系统编译出来的工具,说不可以执行。譬如我想在我的编译主机上执行out/target/product/generic/system/bin下的newfs_msdos,就会报错:
-bash: ./newfs_msdos: cannot execute binary file
这是因为它用到了android系统的文件库缘故,去看源文件就是android/system/core/toolbox /newfs_msdos.c,我们把它抠出来单独编译,如在android/system/core/下建立目录newfs_msdos,然后把 newfs_msdos.c放进来,再建立Android.mk文件,这样写:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := newfs_msdos.c
LOCAL_MODULE := newfs_msdos
LOCAL_STATIC_LIBRARIES := libcutils
include $(BUILD_HOST_EXECUTABLE)
$(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE))
然后处理一些编译newfs_msdos.c的错误,如去掉__unused啊什么的,编译出来后,在out/host/linux-x86/bin可以找到newfs_msdos工具,此时你再运行,就发现可以运行了。