黑马程序员技术交流社区

标题: android可执行文件的交叉编译 [打印本页]

作者: 王松朝    时间: 2012-5-18 12:51
标题: android可执行文件的交叉编译
本帖最后由 王松朝 于 2012-5-18 12:55 编辑

android底层是linux内核,所以linux下的一些程序还是可以跑起来的,只不过android用的linux内核是被修改过的,如果想生成android下可用的二进制可执行文件,可以用交叉编译器编译C代码。
好了,不废话;
交叉编译一般有两种方式
    1.ndk
    2. linux+arm交叉编译器

1.用ndk生成可执行文件的方式和用ndk生成动态库方式差不多,只是Android.mk中最有一句要改成 include $(BUILD_EXECUTABLE);但是因为用ndk就不能直接使用第三方原工程代码中写好的makefile文件,所以如果第三方的工程很庞大的话,还是百度下怎么用ndk链接到makefile文件下吧。

2. 用交叉编译器。用交叉编译的好处就是可以直接使用第三方开源库中已经写好的makefile文件生成最后的可执行文件,只需要把环境搭建好就ok了。
我是这样弄的,
-----------------------隐藏内容------------------
环境     linux 服务器
1.下载linux for arm的交叉编译器,我用的这个 arm-linux-gcc-4.4.3.tar.gz,网上资源很多,
2.交叉编译器不需要安装,只要解压就可以用了。解压命令(后面是解压到什么地方): tar -zxvf arm-linux-gcc-4.4.3.tar.gz   /usr/local/arm
3.下载所需要的第三方开源库源代码,我这里用的是ffmpg ,开源的媒体库,解压到当前目录就好了   tar -jxvf ffmpeg.0.10.tar.bz2
4. 一般linux的工程都会有一个configure文件,为配置工程的文件,在这里指定交叉编译器的路径,在ffmpg目录下
5. 配置ffmpeg编译方式   
./configure --prefix=/home/wangsc/android-ffmpeg/  --cross-prefix=/usr/local/arm/bin/arm-none-linux-gnueabi-  --target-os=linux   --arch=armv7   --extra-cflags=-static   --extra-ldflags=-static

6. make
7 .make install
8.到目录/home/wangsc/android-ffmpeg/bin/ 下就是生成的ffmpeg可执行文件了。
9.用linux的 file 命令查看生成的文件,红色字体是关键,android下的可执行文件只能用static,不能用shared
ffmpeg: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped

最后把这个文件adb push进android设备,改权限为可执行 chmod 755 ffmpeg 就ok了  
注:android下可执行文件只能在/system/bin   或者/data   目录下才可以执行。操作这两个目录都需要root权限

使用
方法1.adb shell 执行
方法2 java代码,Progress类调用系统命令
   ProcessBuilder pb = new ProcessBuilder("/system/bin/sh");
        pb.directory(new File("/"));
       Process proc = pb.start();  
       //获取输入流,可以通过它获取SHELL的输出。   
       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
       BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));  
       //获取输出流,可以通过它向SHELL发送命令。   
       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc  
                       .getOutputStream())), true);  
       out.println("ffmpeg --help");
       proc.waitFor();

      String line;  
       while ((line = in.readLine()) != null) {  
           Log.i(TAG,line);   // 打印输出结果
       }  
       while ((line = err.readLine()) != null) {  
           Log.e(TAG,line);  // 打印错误输出结果
       }  
       in.close();  
       out.close();  
       proc.destroy();


作者: 王松朝    时间: 2012-5-18 12:57
抢一下,沙发,貌似没多大用……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2