本帖最后由 王松朝 于 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();
|
|