Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102863
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-05 21:27
文章分类
文章存档

2014年(24)

2013年(7)

分类:

2014-12-03 21:39:07

如何将Linux中现有的众多资源以最小代价移植到android是很多开发人员关注的,下面这篇文章讲了一个比较取巧的方法,我试验了一下,最基本的hello world可以跑,但是复杂的大型程序要考虑很多问题,thread,IPC,效率等等,还有待验证。
原文地址:
 
在Android上使用动态链接库的一种新方法 - 不使用android linker
 
Android使用的Linker和传统Linux使用的linker(ld.so,ld-linux.so.2,ld-linux.so.3)不同,
他的Bionic里面的libdl实际只是一个stub函数,真正的实现都在system/bin/Linker里面。
 
我认为ld.so针对a.out格式的二进制可执行文件, ld-linux.so.2针对elf格式的二进制可执行文件,
ld-linux.so.3是新一代针对elf格式的二进制可执行文件的Linker,错了的话请纠正。
实际上我试验使用ld-linux.so.3代替android的/system/bin/linker来作为系统动态链接库的
linker。
下面给出一个简单的例子:
hello.c
#include
int main()
{
        printf("\n Hello World \n");
        return 0;

}
所用的Toolchain从Code Sourcery得到。使用的是arm gnu/linux系列。
编译方式: 
arm-none-linux-gnueabi-gcc -o hello.out hello.c -Wl,-dynamic-linker=/yourpath/ld-linux.so.3  (不要使用-static使得程序是动态链接)。

然后找到hello.out依赖的动态库,这里给出的列表是我猜的(因为我的cgywin里没有ldd)。
ld-linux.so.3,
libgcc_s.so,
libc.so.6
(其实用readelf -d也可以找到依赖的动态库。)

我把这些文件从toolchain库(libc/usr/lib)里面找出来然后上传到android emulator的/data/app目录。 

然后将hello.out上传到同一个目录后然后改变其权限使其可执行(chmod).然后执行它,

OK !!you can get it!!

因此,所有的程序不管它是否动态链接库还是其他的,如果在host系统toolchain能成功按上面方法编译,那理论上它就可以在android系统上运行。你只需要将程序和相应的动态库上传到合适的目录。

记住最关键的,编译时一定要加上“-Wl,-dynamic-linker=/yourpath/ld-linux.so.3" 。

注意,这里的youpath要和你在android模拟器上执行这个程序时的路径一样,否则会出not found错误。最好把ld-linux.so.3拷贝到编译目录,并且执行时所有文件都在同一个目录。
阅读(1601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~