Android与Ubuntu下的可执行文件互用

有时候有些命令需要用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工具,此时你再运行,就发现可以运行了。

相关推荐