注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

将Linux下C程序移植到Android上  

2015-12-31 11:25:26|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
首先要说明一点,因为Android的核心同Linux是一样的,就是依赖库不同,Linux依赖于glibc,而Android程序基本都是依赖于Bionic【由谷歌公司开发类库,用来替代glibc】,所以理论上讲只要解决这个依赖的类库不同的问题,基本上Linux下C程序都可以移植,但是也不能百分之百的保证能够正常运行。
移植的过程,基本上有两种办法,下面以一个简单的hello.c为例:

#include<stdio.h>
void main(){
printf("Hello,593668.com!\n");
}

1)用-static参数来静态编译,将程序中所有需要的库全部编译进可执行文件中,这样程序在android中运行就不需要外链接任何动态库了。但是这种做法也会带来一个非常大的弊端就是这个编译后的程序会非常大,资源利用也会非常低下,那怕就是一个几行的小程序,都可以达到好几百k。
编译命令如下:

arm-none-linux-gnueabi-gcc hello.c -static -o hello.out

编译后的hello.out程序大小依不同的编译程序不同,但基本上都有几百K大小,而且其包含的库也不能让其它程序重用。
2)用ld-llinux.so.3来替代android系统中/system/bin/linker来作为链接器进行动态链接【类似于Window下面链接调用DLL】,当然这还需要将相应的动态库也拷贝到android中。这样程序就可以在Android下正常运行了。
编译命令如下:

arm-none-linux-gnueabi-gcchello.c -o hello.out -Wl,-dynamic-linker=/system/lib/ld-linux.so.3

需要说明的是,这个/system/lib是指android手机中存放连接器ld-linux.so.3的目录。正式利用这个连接器来替代android系统中/system/bin/linker才能动态链接运行程序,当然您也可以直接指定其它目录,但是ld-linux.so.3必须放置在相应的目录下,且有可执行权限。
编译完成后,可以输入命令 readelf -d hello.out 来查看它的动态链接库有哪些。比如这个helloworld程序的动态链接库如下图所示:
 将Linux下C程序移植到Android上 - 1976xyg - 红尘若梦
可以看到libgcc_s.so.1和libc.so.6就是这个hello所需要的动态链接库。动态链接库文件一般就在arm-none-linux-gnueabi/libc/armv4t/lib【依据交叉编译开发环境的不同,可能会有些不同,请自行查找】下,将他们cp【包括ld-linux.so.3,libgcc_s.so.1和libc.so.6】 出来,放置到/system/lib目录下,并用chmod 755 给予权限,这样编译后的hello.out有了这些库就可以运行了。当然如果以后同样还有编写好的c程序,如果同样用到这些库的,就不会再次cp这些库了,也就达到了重用库的目的。
  评论这张
 
阅读(124)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017